03-2 函数重载-注意事项
-
引用作为函数重载的条件
#include
using namespace std; void func(int& a) { cout << "func(int& a)" << endl; } void func(const int& a) { cout << "func(const int& a)" << endl; } int main() { int a = 10; func(a); func(10); system("pause"); return 0; } 运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
func(int& a) func(const int& a)
首先,我们应该清楚的是:
int& a
和const int& a
是类型不同的形参。再者,我们要理解
func(a);
调用的是void func(int& a)
,而func(10);
调用的是void func(const int& a)
。-
func(a);
调用的是void func(int& a)
因为
a
是一个变量,变量的特点就是可以读、写。如果加上const
,相当于是限制只可以读。所以在引用的函数重载中,如果传入的是一个变量,ta 会调用不加上const
修饰的函数。 -
func(10);
调用的是void func(const int& a)
如果仔细想想。如果
func(10);
调用void func(int& a)
,那么在运行函数的时候,就会遇到一段int& a = 10;
,这样明显是不符合引用的(引用的本质是一个指针,所以一定要指向的是一块合法的内存空间)。而调用
void func(const int& a)
时,会执行这样一段const int& a = 10;
。在引用的时候我们学习过了。如果我们写一段这样的代码:
const int& a = 100;
编译器会自动改为:
int temp = 100; int& a = temp;
所以
const int& a = 10;
没有语法错误。所以func(10);
会调用void func(const int& a)
。
-
-
函数重载遇到函数默认参数
void func2(int a,int b = 10) { cout << "func2(int a,int b)" << endl; } void func2(int a) { cout << "func2(int a)" << endl; }
这样一段代码是没有错误的。但是我们调用的时候,如果这样传递,就会产生错误:
int a = 10; func2(a);
在这里出现了二义性,会报错。在这里调用函数的时候只传入了一个数据。如果调用
void func2(int a,int b = 10)
,第二个参数有默认值了,可以不传入。但是不传入第二个参数,就会和void func2(int a)
产生歧义:因为void func2(int a)
只需要传入一个参数。所以最好办法就是不要出现,也就是不要写。因为当函数的重载遇到函数的默认参数的时候,很容易出现二义性。
如果出现这样传入,那么就不会出现二义性。(不会产生二义性)。
func2(10, 20);
:-)