C到C++——C++基础

C++是一种通用的、静态类型的、跨平台的编程语言。它是在1979年由Bjarne Stroustrup创建的,最初是作为C语言的扩展来支持面向对象编程。

C++在保留C语言的特性的同时,添加了许多其他的功能,包括类、对象、继承、多态、模板等。这使得C++成为了一种强大而灵活的编程语言,可以用于开发各种类型的应用程序,包括系统级软件、嵌入式系统、游戏开发、图形界面等。

C++也是一种高效的语言,其执行速度接近于C语言,因为它允许直接访问硬件和内存,并支持底层的操作。

C++还具有丰富的标准库,提供了许多常用的函数和数据结构,可以方便地进行文件操作、输入输出、字符串处理等。

总的来说,C++是一种功能强大、高效、灵活的编程语言,广泛应用于软件开发领域。

在系统的了解C++之前,我们要了解一些C++基础,以便我们后面更好的理解其他内容。大家也可以借助这一篇来了解C++对C有何变化:C++对C的扩充-CSDN博客

一.命名空间

1.1同名冲突

当我们在编写程序的时候,如果在一个作用域中出现了两个或多个同名的变量或者函数就会发生错误

int main()
{int a = 0;//……int a = 0;return 0;
}

我们在主函数这个作用域中定义了两个a变量,在编译的时候就会报错。这就是同名冲突。 

同名冲突是在大型应用软件的设计过程中是非常容易发生的。比如程序员A在头文件codeA中定义了student类和fun函数,程序员B在头文件codeB中也定义了student类和fun函数。而当主程序员使用A、B写的功能时要包含其头文件,但是当包含之后,就会在编译时发生错误,因为头文件在编译时会展开,这就意味着在一个程序中同时出现了两个studen类和fun函数,此时就会导致编译失败,因为发生了同名冲突。

1.2命名空间

 为了解决这个问题,ANSIC++增加了命名空间(namespace)。所谓命名空间,实际上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间作用域,把一些全局实体分别放在各个命名空间中,从而与其他全局变量实体分割开来。

命名空间的定义格式为:

namespace 命名空间名
{//命名空间成员
}

 如:定义一个名为xiasicheng的命名空间

namespace xiasicheng
{//命名空间成员const int a = 10;int a = 2;int func(){cout << "hello" << endl;}struct student{int age;char name[10];};}

 命名空间的作用时建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。

在声明一个命名空间时花括号内不仅可以可以包含变量,还可以包含一下类型:

  • 变量(可以初始化)
  • 常量
  • 函数(可以是定义也可以是声明)
  • 结构体
  • 模板
  • 命名空间(命名空间的嵌套)
namespace xiasicheng
{//命名空间成员const int a = 10;namespace xiasicheng2{int b = 0;}
}

需要注意的是,命名空间不会改变变量的生命周期,本来是全局变量,定义在命名空间中还是全局变量。 

1.3命名空间的使用 

1.3.1指定命名空间访问

 当我们需要使用命名空间中的成员时,要用命名空间名和作用于限定符对命名空间成员进行限定,以区别不同的命名空间中可能有同名的标识符:即

//命名空间名::命名空间中的成员名
cout << xiasicheng::a << endl;

 但是当命名空间名字比较长,并且还要多次引用其成员时,就会非常不方便。

为此,C++提供了一些机制,能简化使用命名空间中成员的方法

1.3.2使用命名空间的别名

可以为命名空间起一个别名,用来代替较长的命名空间名。

如:

namespace Television
{int a = 0;
}namespace TV = Television;//用TV代替Televisionint main()
{cout << Television::a << endl;cout << TV::a << endl;return 0;
}

1.3.3使用using将命名空间中某个成员展开

using后面的成员名必须是由命名空间名限定的名字。例如:

using TV::a;

它表示在using语句所作用的作用域中可以用TV命名空间中的成员a,而且不必再逐个用命名空间名限定了。当我们要再使用变量a时,直接调用即可: 

cout << a << endl;//相当于cout << TV::a << endl;

但是要注意,在同一作用域中用using声明的不同命名空间的成员不能有同名的成员。 

1.3.4使用using namespace展开命名空间 

C++提供了using namespace 语句来实现一次性展开命名空间,一般格式为:

using namespace 命名空间名;

当我们利用该语句展开某个命名空间之后,该命名空间中的所有成员都可以直接进行访问,不必再使用作用于限定符限定或者using语句声明某一个成员。 

 当是在使用using namespace 和using展开某一个成员时,都存在风险,所以在项目中时,建议使用命名空间名+作用于限定符的方式来访问变量。

二.C++的输入输出

C++有一套自己的输入输出方式,我们可以使用cout来实现输出,cin实现输入。它们是C++的标准输出流和输入流。

int a = 0;
cin >> a;
cout << a << endl;

因为C++是包含C的,所以在我们的C++程序中,也可以使用C语言的输入输出方式,但是C++的输入输出有一个很好的东西,那就是可以自定识别类型。我们不再像C语言那样要进行格式控制,我们C++直接写入变量名即可,不必控制变量的类型,cout和cin会自动识别的。 

int main()
{int a = 0;cin >> a;scanf("%d", &a);cout << a << endl;printf("%d\n", a);return 0;
}

其实cout和cin也是包含在std这个命名空间中的,因为我们再文件开头就展开了std,所以我们不再需要进行限定,所以cout和cin的使用可以借助std和作用域限定符:

std::cin >> a;
std::cout << a << endl;

三.缺省参数

缺省参数也叫做有默认参数的函数,所以缺省参数是应用在函数模块中的。其含义就是在定义函数时,给形参一个默认值,当我们调用该函数时,如果没有传实参,该函数就会使用这个默认值,如果传了实参,该函数就会使用该实参而屏蔽掉缺省参数。

int MAX(int a = 0, int b = 0)
{return a > b ? a : b;
}

当一个函数有多个形参时,其可以分为全缺省,半缺省,不缺省:

全缺省就是其形参每一个都带有默认值,传参数时,可以只传一个,也可以传多个,传了就用实参,没传的就用缺省值。 

半缺省就是只有一部分形参有缺省值,当一个函数是半缺省时,其带有缺省值的形参必须在形参表列的最右边。

int func(int a, int b, int c = 0, int d = 0)
{cout << a << " " << b << " " << c << " " << d << endl;
}

如果缺省值跳跃,在传参时就会产生歧义:

int func(int a = 1, int b, int c = 0, int d = 0)
{cout << a << " " << b << " " << c << " " << d << endl;
}int main()
{func(2);return 0;
}

此时,2是传给a呢?还是b呢?所以为了避免该情况的出现,带缺省值的形参应在形参表列的最右边。 

四.变量的引用

引用(reference)是C++对C的一个重要扩充

4.1引用的概念

在C++中,变量的“引用”就是变量的别名,因此引用又叫别名(alias)。建立“引用”的作用是为一个变量再起另一个名字,以便在需要时可以方便、间接地引用该变量,这就是引用名称的由来。当我们给一个变量起了一个别名之后,他们两个占用同一块空间。

int a = 10;
int& b = a;//给a取了一个别名b,a和b占用同一块内存空间

注意:在声明一个别名时,必须同时给出初始化。 

我们打印a和b的地址可以看到它们的地址相同。 当我们修改其中任意一方时,另一方也会发生改变。

4.2引用的特性

4.2.1引用在定义时必须初始化且引用的类型必须和被引用对象的类型相同

int main()
{int a = 0;int& b = a;//正确int& c;//没有初始化double& d = a;//引用类型与被引用类型不同return 0;
}

4.2.2一个变量可以有多个引用

int a = 0;
int& b = a;
int& c = a;
int& d = a;

当我们打印它们的地址时,它们都指向的是同一块空间: 

4.2.3引用在初始化后不能再被重新声明为另一个变量的别名 

int main()
{int a = 0;int& b = a;//b是a的别名int c = 10;&b = c;//企图让b成为c的别名,错误return 0;
}

4.2.4对于引用的初始化,可以用一个变量名,也可以用另一个引用

int main()
{int a = 10;int& b = a;int& c = a;//用变量初始化int& d = b;//用另一个引用初始化return 0;
}

4.3引用作为函数参数 

用引用作为函数参数时,可以代替传地址的方式使实参改变,当函数形参为引用时,实参直接传变量也会改变。

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

 我们可以对比引用传参和指针传参的区别,引用传参会更加方便,如果使用指针的话还要对变量进行解引用。

4.4const引用

const引用可以作为普通变量的别名,也可以作为const变量的别名。前者属于权限缩小,或者属于权限平移。

int a = 0;
const int& b = a;

此时b不可以改变,但是a可以改变。 此时属于权限缩小,原来a可写可读,b只能读不能写。

const int c = 100;
const int& d = c;

 此时c和d都不能改变。此时属于权限平移,原来c只可读不可写,d也只能读不能写。

需要注意的是,权限只能平移或者缩小,但不能放大。

const int e = -1;
int& f = e;

e只可读,但f作为e的引用可读可写,此时权限放大,运行会出错。 

 4.5const引用中的常属性临时变量

double a = 1.2;
int& b = a;

a是浮点型,而想给其取一个int型的别名。此时会发生隐式转化,a会隐式转化为整型储存在临时变量中,而临时变量具有常属性,只可读,但是给其取别名时发生了权限放大,所以上面的写法是错误的。

正确的方法是用const引用接收:

double c = 2.2;
const int& d = c;

 4.6引用和指针的关系

C++中引用是引用,指针是指针,两者相辅相成。

  • 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
  • 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
  • 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
  • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
  • sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)。
  • 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

 

五.重载函数

C++中的输入输出语句中用到的<<和>>叫做流插入操作符和流提取操作符。而在C语言中,它们作为位运算符,这叫做运算符重载,即一物多用。

而重载函数也叫函数重载,也就是一物多用的意思,同名函数有着不同的作用。

C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,用来实现不同的功能。这就是函数重载,即一个函数名多用

int ADD(int x, int y)
{return x + y;
}double ADD(double x, double y)
{return x + y;
}

对上面两个函数而言,实现了整数相加和浮点数相加的功能,当我们调用ADD函数时,该函数会根据参数的不同,调用不同的函数。这就是函数重载的体现。 

但是函数重载的前提是:函数的形参表列不同

  • 形参个数不同
  • 形参类型不同
  • 形参个数和类型都不同
  • 形参顺序不同

需要注意的是,函数重载跟返回值类型无关,返回值不同,形参相同的两个函数不能设计为重载函数。 

六.inline

inlne是C++的一个关键字,它可以使一个函数成为内联函数。

调用函数时需要建立函数栈帧,这需要时间,当一个函数被频繁调用时,就会加大时间的消耗,导致程序效率降低。C++提供了一种提高效率的方法,即在编译时将所调用函数的代码嵌入到主调函数中。这种嵌入到主调函数中的函数称为内联函数,又称内置函数。

inline int ADD(int x, int y)
{return x + y;
}

当我们调用该函数时,其就会在调用出展开: 

int main()
{ADD(1, 2);return 0;
}
//展开
int main()
{return 1 + 2;return 0;
}

 其实,inline的出现是为了替代C语言中的宏。因为宏是一种文本替换不进行类型检查,不安全。所以C++就引入了inline这一关键字。

但是函数是否展开是跟编译器有关的。当你将一个函数定义为inline时,编译器会检查你设置的是否合理,如果合理,编译器就会在调用出展开;否则,就不展开。

将一个函数定为内联函数的前提是,该函数代码量少(10行之内),且会被频繁调用。  

七.nullptr

nullptr是C++11引入的一个空指针常量。在C++中,空指针通常用NULL或0来表示,但这种表示方式可能存在一些模糊性和歧义。为了解决这个问题,C++11引入了nullptr作为一个明确的空指针常量。

nullptr可以被赋值给指针类型的变量,表示该指针不指向任何有效的内存地址。使用nullptr可以提高代码的可读性和安全性,因为它可以更清晰地表示一个空指针。另外,nullptr还可以与其他指针进行比较操作,以判断指针是否为空。

示例代码:

int* ptr = nullptr; // 定义一个指向整型的空指针if (ptr == nullptr) {// 检查指针是否为空// 执行相关操作
}

总的来说,nullptr是C++中用于表示空指针的常量,它在C++11中被引入,提高了代码的可读性和安全性。


完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395175.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据面试SQL(五):查询最近一笔有效订单

文章目录 查询最近一笔有效订单 一、题目 二、分析 三、SQL实战 四、样例数据参考 查询最近一笔有效订单 一、题目 现有订单表t5_order&#xff0c;包含订单ID&#xff0c;订单时间&#xff0c;下单用户&#xff0c;当前订单是否有效。 请查询出每笔订单的上一笔有效订…

Vue - 关于vue-kinesis 移动动画组件

Vue - 关于vue-kinesis 移动动画组件 vue-kinesis可以根据鼠标移动或滚动条来控制元素动画的动画效果&#xff1b;除此之外&#xff0c;vue-kinesis 还可以设置音频文件&#xff0c;根据音频频率来控制动画的跳动效果。 一、安装vue-kinesis Vue2版本&#xff1a; 1.安装 …

2024.8.08(python)

一、搭建python环境 1、检查是否安装python [rootpython ~]# yum list installed | grep python [rootpython ~]# yum list | grep python3 2、安装python3 [rootpython ~]# yum -y install python3 安装3.12可以使用源码安装 3、查看版本信息 [rootpython ~]# python3 --vers…

数字信号处理2: 离散信号与系统的频谱分析

文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性&#xff0c;设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…

游戏行业最新报告 | 2024年1—6月:中国游戏市场收入上升至1472.67亿元

2024年1—6月收入&#xff1a;达1472.67亿元&#xff0c;同比增长2.08% 伽马数据提供的数据显示&#xff1a;2024年1—6月&#xff0c;国内游戏市场实际销售收入1472.67亿元&#xff0c;同比增长2.08%&#xff0c;增长趋势较为平稳。 中国市场实际销售收入及增长率 游戏用户达…

(24)(24.2) Minim OSD快速安装指南(一)

文章目录 前言 1 概述 2 基本接线图 3 关键冷却条件的可选设置 4 固件可用于MinimOSD 5 MWOSD 前言 MinimOSD “屏幕显示”是一个小型电路板&#xff0c;它从你的自动驾驶仪中提取遥测数据&#xff0c;并将其覆盖在你的第一人称视图监视器上(First Person View)。Minim …

极限挑战:40亿个非负整数中找到没有出现的数(bit数组)

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好!我是小米,一个积极活泼、热爱分享技术的29岁程序员。今天,我们一起来探讨一个有趣且实用的算法问题:如何在40亿个非负整数中找到没有出现的数…

Powershell 禁用系统更新

创建一个关闭系统更新脚本 脚本系统兼容10,11,2012,206,2019,2022,2025powershell-install-stop-System-update.ps1 <# Powershell Install stop System update +++++++++++++++++++++++++++++++++++++++++++++++++++++ + _____ _____ _ …

供应商较多的汽车制造业如何选择供应商协同平台?

汽车制造业的供应商种类繁多&#xff0c;根据供应链的不同环节和产品特性&#xff0c;可以大致分为以下几类。 按供应链等级分包括&#xff1a; 一级供应商通常具有较高的技术水平和生产能力&#xff0c;能够满足汽车厂商对零部件的高品质、高性能和高可靠性的要求。 二级供应…

ImportError: DLL load failed while importing _rust: 找不到指定的程序的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Android Studio】Webview 内核升级得三种方法

【Android Studio】Webview 内核升级得三种方法 前言X5 腾讯组件crosswalk开源项目webview升级加载的内核&#xff08;完美解决&#xff09;总结 前言 在APP 中进行网页加载&#xff0c;一般采用原生自带的Webview 组件&#xff0c;但在需要加载高版本网页的时候&#xff0c;有…

【CSS入门】第三课 - padding内填充

上一节&#xff0c;我们说了margin外边距&#xff0c;还举了个例子&#xff0c;比如两个人紧挨着站着&#xff0c;如果两个人冬天穿了棉袄&#xff0c;很厚很厚的棉袄&#xff0c;那么他俩占据的空间就会增加&#xff0c;他俩之间的真实距离也会增加。 这一节&#xff0c;我们…

《暗黑破坏神 IV》是什么类型的游戏,苹果电脑能玩暗黑破坏神吗 crossover玩暗黑4

《暗黑破坏神 IV》&#xff08;Diablo IV&#xff09;是由暴雪娱乐开发的一款动作角色扮演游戏&#xff08;Action RPG&#xff09;&#xff0c;是广受欢迎的《暗黑破坏神》系列的最新作品。暗黑破坏神4拥有出色的游戏画面、音效和丰富的游戏玩法&#xff0c;非常值得玩家们去尝…

SpringBoot3热部署

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency> 默认就是,无需配置 可以了…

ADB Installer 0 file(s)copied

在为泡面神器刷安卓&#xff0c;做准备工作装ADB时报错了&#xff0c;以下是报错提示 再用cmd命令adb version验证下&#xff0c;提示adb不是有效命令&#xff0c;百分百安装失败了&#xff0c;往上各种搜索查询均没有对症的&#xff0c;其中也尝试了安装更新版本的&#xff0c…

翻译: 可视化深度学习反向传播原理一

本期我们来讲反向传播 也就是神经网络学习的核心算法 稍微回顾一下我们之前讲到哪里之后 首先我要撇开公式不提 直观地过一遍 这个算法到底在做什么 然后如果你们有人想认真看里头的数学 下一期影片我会解释这一切背后的微积分 如果你看了前两期影片 或者你已经有足够背景知…

牛羊肉巨头的数字化战略:凯宇星辉如何领先市场

凯宇星辉的创业成长史&#xff0c;给出了中国牛羊肉企业如何从散户走向集团化经营的路线图。 总部位于大连的凯宇星辉&#xff0c;在牛羊肉进口贸易领域白手起家&#xff0c;十余年时间&#xff0c;已形成以澳新、南美、北美等全球三大牛羊肉主产区为主渠道的全球直采网络布局…

《MySQL数据库》 数据类型、约束、键的使用—/—<5>

一、常见数据类型 1、数值类型&#xff1a; INT、BIGINT、FLOAT、DOUBLE&#xff0c;DECIMAL等。 INT&#xff08;整型&#xff09;&#xff1a;通常占用4个字节&#xff0c;可以存储范围为-2^31到2^31-1的整数。 BIGINT&#xff08;大整型&#xff09;&#xff1a;通常占用8…

【OCCT】第3讲 OpenCasCadeVTK实现三维建模Demo

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享OpenCasCade&VTK共同实现三维建模Demo,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1.…

AI2021矢量图形软件:Illustrator 2021 Win/Mac 直装版

dobe Illustrator 2021是一款功能强大的矢量图形设计软件&#xff0c;广泛应用于出版、多媒体和在线图像制作领域。该软件特别适用于印刷出版、海报书籍排版、专业插画、多媒体图像处理以及网页设计&#xff0c;能够提供高精度和控制的线稿&#xff0c;适合处理从简单到复杂各种…