引言:C++是C的一个超集,即C++继承了C语言的全部特性。C++不仅包含了C的关键字、语法和语义,还增加了一些新的特性。例如命名空间、引用、函数重载等,本片博客旨在向大家分享C++相较于C语言,增加的一些新的特性。
1.命名空间namespace
我们知道,在C语言中编写程序时,有时会存在标识符名与标准库中的标识符名冲突的情况,为了解决此种命名冲突,C++中引入了命名空间namespace的概念。
使用命名空间的目的是使标识符的名称局域化,即使标识符只在某一个限定域内有效,从而防止命名冲突的问题。
1.1命名空间的定义
定义命名空间使用的关键字:namespace
定义命名空间的格式:namespace 空间名称 {}
{}中即为该命名空间中的成员。例如:定义一个名称为qpy的命名空间。
那么命名空间中可以定义哪些成员呢?
1)命名空间中可以定义变量/函数/类型。
2)命名空间可以嵌套定义,即可以在一个命名空间中再定义命名空间。
3)一个项目中允许有多个重名的命名空间,最后编译器在处理时,会把重名的命名空间合并。
1.2命名空间的使用
1)使用域作用限定符”::“
例如,我们使用C++中标准命名空间std的输出关键字。
2)使用using关键字将命名空间中某个成员引入
3)使用using namespace +命名空间名称,将整个命名空间展开
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。
在我们日常练习中,使用标准库中的一些方法或变量时,使用方法三即可,但在大型项目中建议用前面的两种方法,因为大型项目中,代码量较大,命名时容易与标准库中的命名产生冲突。
2.引用
2.1引用的定义
引用,是为已经存在的变量取别名。
就可以形象地理解为我们的大名和小名,虽然名称不一样,但实际上是指同一个人。
2.2引用的格式
类型& 引用变量名 = 引用实体名
其中,'&'表示引用符号。
b是a的引用。
2.3引用使用的注意点
1)引用类型必须和被引用的实体是同类型的。
2)引用必须在定义时初始化。
3)一个变量可以有多个引用,但一个引用只能作为一个实体的引用。即不能同时作为多个实体的引用。
4)一个引用一旦作为一个实体的引用,不能再引用其他实体。
2.4引用的使用范围
1)可以作为函数的参数传递,即传引用传参
我们常用的传值传参,形参是实参的一份临时拷贝,函数对形参进行处理后再返回结果。
如果使用引用作为参数,无需拷贝,可以直接用引用对变量进行操作。
我们以经典的swap()交换函数为例:
上图中,使用传值传参,可以发现并未实现交换,这是因为形参a,b是实参a,b的一份临时拷贝。在Swap()函数中,只对形参a,b进行了交换,实参不受影响,随着Swap()函数执行结束,形参a,b被销毁,实参a,b没有进行任何操作。
在C语言中,为解决这个问题,我们的方法是传址实现交换。
通过在Swap()函数中传入实参地址,实现了在调用的函数中直接对实参进行操作。实现了交换。
以上方法可行,成功实现了交换,但我们在了解到了C++中的引用后,也可以使用传引用传参的方法来解决这个问题。
形参是实参的引用,对形参的修改实际就是对实参的修改,也可实现交换。并且代码更加简洁。
2)可以作为函数的返回值,即传引用返回,省去了传址返回的拷贝操作。
但是,使用传引用返回时,返回的引用对象要保证没有被销毁,否则的话,不能使用传引用返回。
c变量只存在于sub()函数范围内,随着函数调用结束,变量c也会被操作系统回收,如果此时使用一个引用变量作为c的引用,sub()函数结束后,再用c的引用去访问c对应的变量,则这种访问是非法的。
2.5引用的实质
引用在语法概念上是给变量起别名,底层是用指针实现的。
3.函数重载
3.1函数重载的定义
C++支持在同一作用域中定义同名的函数。这些函数的形参不同。
形参不同包括:
- 形参的类型不同
- 形参的个数不同
- 形参的顺序不同
通过函数重载的定义我们可以知道,C语言中是不支持定义重名函数的,这就给我们增加了编码工作量,例如在C语言中,我们实现两个整数相加的操作,则我们可以声明:
int Add(int a,int b);
那么如果我们实现两个浮点数的加法呢?
则我们就必须想一个与Add不同的函数名
int AddFloat(float a,float b);
那么如果还要实现两个double类型的数的加法呢?
...
在C++中,我们只用一个函数名就可以实现这些不同的需求,只需借助函数重载,我们传入参数,由编译器自动识别参数类型。
int Add(int a,int b);
float Add(float a,float b);
double Add(double a,double b);
...
3.2C++支持函数重载的原因
编译器编译时会对函数根据其参数进行修饰。
C++可以通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,具体我们不详细分享,大家可以下去自行查阅相关资料。
注意:
仅仅返回值类型不同,在C++中是不构成重载的。
标签:空间,函数,形参,C++,命名,引用,重载,入门 From: https://blog.51cto.com/u_16191221/9049855结语:以上就是本期小Q和大家分享的内容,如果文章中有错误或不恰当之处,欢迎在评论区指出或者给小Q私信,希望大家可以从本篇分享中有所收获,如果觉得文章不错,希望给个一键三连,你的支持是小Q进步的动力,我们下篇文章再见!