本节讨论重载,指针,引用。
重载
所谓重载,就是函数名相同,参数不同(类型,数量,顺序不同)。
也就是说,C++允许多个函数拥有相同的函数名,通过函数参数来区分调用的是哪个函数。
参数类型不同
如下图所示,创建了两个名字相同,但是传入的参数类型不同的函数add_a_b。
在main函数中调用add_a_b,首先传入的是int类型的参数,然后是char类型的参数,看看编译器是否可以区分调用的是哪个函数。
执行结果如下,程序先进入了传入int类型的add_a_b函数,然后进入了传入char类型的add_a_b函数。
也就是说,编译器通过传入的参数类型不同,调用了不同的函数。
数量不同
函数名相同,参数数量不同,编译器也能区分调用不同的函数。
创建一个传入三个char类型的参数的函数,看看编译器是否可以区分。
编译结果符合预期,编译器可以根据参数的数量,识别调用不同的函数。
顺序不同
新增两个测试函数,将它们的传参的类型顺序颠倒,一个传入(int,char)类型的参数,另一个传入(char, int)类型的参数,看看编译器能否识别。
测试结果如下,先调用了传入(int,char)类型的函数,然后调用了传入(char,int)类型的函数。
也就是说,编译器可以根据传入参数的顺序不同,调用不同的函数。
返回值类型不同
问:还有一个问题,就是如果传入的参数相同,仅返回值不同,那么编译器可以区分调用的是哪个函数吗?
可以测试一下,测试程序如下图所示。
定义了两个传参相同,但是返回的类型不同的函数,测试编译器是否可以区分。
此时,编译会报错,编译器不知道要调用哪个函数,是第3行的add_a_b函数,还是第9行的add_a_b函数。
也就是说,编译器不能根据返回参数的不同,区分调用不同的函数。
小结
通过上面的测试,可以看出,C++编译器在处理相同函数名的函数调用时,可以通过:
- 传入参数的类型;
- 传入参数的数量;
- 传入参数的顺序;
三者,实现区分调用的函数。
但是,不能根据返回值的类型来区分调用哪个函数。
指针
C++的指针C语言的指针基本相同,使用也基本一致,都是记录变量的地址。
如下图,由于使用的是值传递,所以调用 add_one函数 后,main 中的 a 变量的值不会增加,还是99。
要想 a 的值同步修改,可以使用指针,修改后的程序如下。
此时,通过 add_one 函数,main 中的变量 a 实现了加一。
总结
C/C++的指针基本是一致,就不做过多的解读了。
引用
不使用指针,但是还是想要在函数中修改外部参数的值,那么可以使用引用。
引用,相当于给已经存在的变量起一个别名,之后对这个引用的操作,就相当于对原变量进行操作。
需要注意的是,引用使用的是 & 符号。
修改代码,增加一个add_one_ref函数,传参一个引用,传入变量 a。
编译测试,发现 a 的值确实被修改了。
再简单的说明一下引用。
下面的代码,首先创建了一个变量 a,然后将 b 设为 a 的引用。
这样,b 就是 a 的引用,之后所有对 b 进行的操作,就会同步到 a。
int a = 100;
int &b = a;