C++函数重载的疑惑
我在看《C++ Primer Plus 第六版》的时候,发现了一处不对的地方(应该是翻译错误,看下图中英文对照)
在中文版(第277页)中,写的是“并不区分”:
而英文版(第414页)中,写的是“does discriminate(区分)”:
然后我就写了以下2个函数来验证一下,结果编译器报错,说重复定义了(不区分?)
参数是值传递的
#include <iostream>
using namespace std;
int foo(int x)
{
cout << "int x" << endl;
return x;
}
int foo(const int x)
{
cout << "const int x" << endl;
return x;
}
int main(int argv, char **argc)
{
int a(7);
cout << foo(a) << endl;
return 0;
}
#include <iostream>
using namespace std;
int foo(int& x)
{
cout << "int x" << endl;
return x;
}
int foo(const int& x)
{
cout << "const int x" << endl;
return x;
}
int main(int argv, char **argc)
{
int a(7);
cout << foo(a) << endl;
const int b(8);
cout << foo(b) << endl;
return 0;
}
[解决办法]
确实是只有当参数是指针或引用时才能用const重载
[解决办法]
1. 翻译错了。
2. 主楼第一个例子无法形成重载,因为这他们的 function type 相同。
[解决办法]
翻译的问题
[解决办法]
嗯,翻译的问题!
[解决办法]
关于const 重载几乎在所有c++的书中者提到过但大部分只是一句话,例如在《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”
但是这一段描述并没有给出引用、指针和值传递前加const的实质区别是什么。在用非const的指针,引用和值均可转化为const的。这一点没有太多可说明的东东。
对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。
[解决办法]
只有当形参是 指针 或者 引用 的时候,const 才能用来做重载区分