为何优先选用带const的重载函数?print(1)输出2的原因是什么?
关于C++函数重载的两个问题解答
先把你给出的重载函数代码贴出来方便参考:
void print( int & a ){ cout << a << endl; } void print( const int & a ){ cout << 2*a << endl; } void print( float a ){ cout << 3*a << endl; }
1. 为何要使用带const的函数重载版本,而非无const的第一个函数?
咱们得先搞清楚非const引用的限制:非const的左值引用(也就是int&)是不能绑定到右值的,比如字面量1、临时计算结果这类没法被修改的临时值,都没法传给第一个函数。如果只保留第一个print(int&)版本,那像print(1)、print(2+3)这种调用都会直接编译报错,因为编译器找不到能匹配的函数。
而带const的引用版本就不一样了:const int&既可以绑定普通的左值(比如一个int变量),也能绑定右值和const类型的对象。它的存在不仅解决了右值无法传入的问题,还能保证函数内部不会意外修改传入的参数(因为是const引用),安全性更高。简单说,这个const重载版本是为了让函数能处理更多场景,同时保持代码的安全性。
2. 调用print(1)时输出结果为2的原因是什么?
咱们一步步看编译器的匹配逻辑:
- 首先,
1是一个int类型的右值。第一个函数的参数是int&,没法绑定右值,直接被排除; - 第二个函数的参数是
const int&,可以完美绑定int类型的右值,属于精确匹配; - 第三个函数的参数是
float,要匹配的话需要把int类型的1隐式转换成float,这属于需要转换的匹配;
C++编译器在选择重载函数时,会优先选精确匹配的版本,所以这里会调用第二个print(const int&)函数,执行cout << 2*a,a的值是1,自然就输出2了。
内容的提问来源于stack exchange,提问作者Asad Masroor
相关产品推荐
相关产品推荐

