0
点赞
收藏
分享

微信扫一扫

C++入门-命名空间、引用、函数重载

引言:C++是C的一个超集,即C++继承了C语言的全部特性。C++不仅包含了C的关键字、语法和语义,还增加了一些新的特性。例如命名空间、引用、函数重载等,本片博客旨在向大家分享C++相较于C语言,增加的一些新的特性。

1.命名空间namespace

我们知道,在C语言中编写程序时,有时会存在标识符名与标准库中的标识符名冲突的情况,为了解决此种命名冲突,C++中引入了命名空间namespace的概念。

使用命名空间的目的是使标识符的名称局域化,即使标识符只在某一个限定域内有效,从而防止命名冲突的问题。

C++入门-命名空间、引用、函数重载_传引用

1.1命名空间的定义

定义命名空间使用的关键字:namespace

定义命名空间的格式:namespace 空间名称 {}

{}中即为该命名空间中的成员。例如:定义一个名称为qpy的命名空间。

C++入门-命名空间、引用、函数重载_传引用_02

那么命名空间中可以定义哪些成员呢?

1)命名空间中可以定义变量/函数/类型。

C++入门-命名空间、引用、函数重载_函数重载_03

2)命名空间可以嵌套定义,即可以在一个命名空间中再定义命名空间。

C++入门-命名空间、引用、函数重载_C++_04

3)一个项目中允许有多个重名的命名空间,最后编译器在处理时,会把重名的命名空间合并。

1.2命名空间的使用

1)使用域作用限定符”::“

例如,我们使用C++中标准命名空间std的输出关键字。

C++入门-命名空间、引用、函数重载_传引用_05

C++入门-命名空间、引用、函数重载_C++_06

2)使用using关键字将命名空间中某个成员引入

C++入门-命名空间、引用、函数重载_函数重载_07

3)使用using namespace +命名空间名称,将整个命名空间展开

C++入门-命名空间、引用、函数重载_命名空间_08

std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。

在我们日常练习中,使用标准库中的一些方法或变量时,使用方法三即可,但在大型项目中建议用前面的两种方法,因为大型项目中,代码量较大,命名时容易与标准库中的命名产生冲突。

2.引用

2.1引用的定义

引用,是为已经存在的变量取别名。

就可以形象地理解为我们的大名和小名,虽然名称不一样,但实际上是指同一个人。

2.2引用的格式

类型& 引用变量名 = 引用实体名

其中,'&'表示引用符号。

C++入门-命名空间、引用、函数重载_命名空间_09

b是a的引用。

2.3引用使用的注意点

1)引用类型必须和被引用的实体是同类型的。

2)引用必须在定义时初始化

3)一个变量可以有多个引用,但一个引用只能作为一个实体的引用。即不能同时作为多个实体的引用。

4)一个引用一旦作为一个实体的引用,不能再引用其他实体。

2.4引用的使用范围

1)可以作为函数的参数传递,即传引用传参

我们常用的传值传参,形参是实参的一份临时拷贝,函数对形参进行处理后再返回结果。

如果使用引用作为参数,无需拷贝,可以直接用引用对变量进行操作。

我们以经典的swap()交换函数为例:

C++入门-命名空间、引用、函数重载_命名空间_10

上图中,使用传值传参,可以发现并未实现交换,这是因为形参a,b是实参a,b的一份临时拷贝。在Swap()函数中,只对形参a,b进行了交换,实参不受影响,随着Swap()函数执行结束,形参a,b被销毁,实参a,b没有进行任何操作。

在C语言中,为解决这个问题,我们的方法是传址实现交换。

C++入门-命名空间、引用、函数重载_传引用_11

通过在Swap()函数中传入实参地址,实现了在调用的函数中直接对实参进行操作。实现了交换。

以上方法可行,成功实现了交换,但我们在了解到了C++中的引用后,也可以使用传引用传参的方法来解决这个问题。

C++入门-命名空间、引用、函数重载_C++_12

形参是实参的引用,对形参的修改实际就是对实参的修改,也可实现交换。并且代码更加简洁。

2)可以作为函数的返回值,即传引用返回,省去了传址返回的拷贝操作。

但是,使用传引用返回时,返回的引用对象要保证没有被销毁,否则的话,不能使用传引用返回。

C++入门-命名空间、引用、函数重载_C++_13

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++中是不构成重载的。


结语:以上就是本期小Q和大家分享的内容,如果文章中有错误或不恰当之处,欢迎在评论区指出或者给小Q私信,希望大家可以从本篇分享中有所收获,如果觉得文章不错,希望给个一键三连,你的支持是小Q进步的动力,我们下篇文章再见!

举报

相关推荐

0 条评论