C++入门-2.C++的改进

时间:2024-11-10 09:37:35

C++相较于C,弥补了很多C语言中的不足,以下将简略介绍。

2.1 namespace

命名空间域的产生,使得C++中的变量命名即为方便,且使得在写大型工程项目的时候,极大减少了可能出现的全局变量重定义冲突。
在VS下,编译器查找一个变量时,默认按照先局部域,后全局域的顺序,并不会到命名空间域中查找。若想要使用命名空间域中定义的变量,则需要使用域作用限定符,该符号由两个不间隔的冒号组成,即:: ,使用的时候相应命名空间域的名称+::+变量名,这样便可正常使用命名空间域中的变量。示例如下:
在这里插入图片描述

但是,使用命名空间域中的变量,如果每次都需要通过域作用限定符才能使用的话,数量一旦增多,便会过于麻烦。所以,在我们平常练习,而非大型项目中,或者确保不会产生冲突时,可以将命名空间域展开到全局域中,这样我们就可以直接使用命名空间域中的变量了。

全部展开
在这里插入图片描述
部分展开
在这里插入图片描述

2.2 函数参数缺省

C++中引入了函数缺省参数的语法,意思是:我们给函数的形参设定一个默认值,如果函数调用时,没有传参,则使用这个默认值,若正常传参,则使用实参值。
缺省参数分为半缺省和全缺省两种:全缺省即全部形参均有默认值,半缺省则只有部分形参有默认值(半缺省中形参必须从右往左缺省,即给默认值首先要从靠右的形参开始,不能跳跃,否则编译器会报错)。示例如下:

半缺省
在这里插入图片描述
注意,下图是错误的:
在这里插入图片描述

全缺省
在这里插入图片描述
与半缺省参数缺省顺序相反,我们调用函数传实参时,是从左往右传参,即首先给靠左的形参传值,而后再给右边的。示例如下:
在这里插入图片描述

特别注意
当函数定义与声明分离时,缺省参数只能写在函数的声明中,而不能写在函数的定义中,更不能两个地方都写。

2.3 函数重载

函数重载是C++相较于C,有很大进步的一个地方,函数重载的语法使得我们函数可以重命名,但要保证参数的不同(形参的类型或数目不同),进而实现不同的函数功能。
比如说,我们想要两个ADD函数,一个实现整型的相加,另一个实现浮点型的相加。如果在c语言中,我们可能要一个命名为ADDi,另一个命名为ADDf,但在C++中则没有这个必要。示例如下:
在这里插入图片描述
同样是add,但通过函数重载,在函数调用时,通过自动识别实参的类型,进而对应不同的add函数,从而分别实现两个整型数据相加,两个浮点型数据相加。

需要注意的是:
构成函数重载的两个函数满足函数名相同,但函数形参不同。若是两个函数完全相同,则不是函数重载,而是函数的重定义,会报错。
同时,当两个函数只有返回值不同时,并不构成函数重载,此时编译器无法区分这两个函数,调用这样的函数会报错。所以,实质上,编译器是通过形参的不同来区分重载函数的。

函数重载下的特例
当缺省参数与函数重载混合在一起时,可能会出现两个函数构成函数重载,但编译器依旧无法识别的情况:
在这里插入图片描述

2.4 引用

引用也是C++中非常有特色的一个语法。引用不是定义新变量,可以理解为,引用相当于给已存在变量取一个别名,它实质上就是这个已存在变量,与之使用同一块内存空间,所以使用引用时,是不会创建新的内存空间的。

引用的格式如下:
在这里插入图片描述
当然,我们也可以给别名取别名:
在这里插入图片描述
实质上,不管怎么取别名,它们都是a,使用的都是a的内存空间。

2.4.1 引用传参

引用的出现,一定程度上替代了指针的作用,原先需要传址调用的函数,现在可以通过引用来替代:
在这里插入图片描述
这两个函数都可以实现对传入实参扩大为原来2倍的功能。

2.4.2 引用作返回值

正常情况下,函数的返回值具有常性,是不更改的右值,因而不能作为左值去更改。但如果我们想要函数的返回值是一个可更改的左值,则需要使用引用作返回值。示例如下:
在这里插入图片描述
此时add的返回值ra便是一个可修改的左值,实质上add(a)就是a

2.4.3 引用的权限问题

引用在某些方面,尤其是参数的改变上,可以达到和指针相同的效果,因此,同指针一样,引用也会涉及到权限的问题。
在引用中,权限只能平移或缩小,不能放大,这与指针相同。示例如下:
在这里插入图片描述
除上述常见情况之外,还需要注意一些特殊情况:

在这里插入图片描述

2.4.4 引用与指针

引用与指针功能有很大的重合之处,但二者又有很多不同,引用无法取代指针,二者是相辅相成的。

  1. 引用和指针在汇编底层其实都是通过指针实现的,在汇编底层是没有引用这个概念的。
  2. 引用必须初始化,而指针可以不初始化(不过这样会造成野指针)。
  3. 引用一旦初始化,便不可更改;指针定义后,可以改变指向。
  4. 引用不需要创建新的内存空间,而指针变量需要创建新的内存空间用以存储。