首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++函数满载的疑惑

2013-08-26 
C++函数重载的疑惑我在看《C++ Primer Plus 第六版》的时候,发现了一处不对的地方(应该是翻译错误,看下图中

C++函数重载的疑惑
我在看《C++ Primer Plus 第六版》的时候,发现了一处不对的地方(应该是翻译错误,看下图中英文对照)

在中文版(第277页)中,写的是“并不区分”:

C++函数满载的疑惑

而英文版(第414页)中,写的是“does discriminate(区分)”:

C++函数满载的疑惑


然后我就写了以下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和non-const的,但是第一次那2个函数为什么不能实现重载呢???


c++ 函数重载
[解决办法]
很明显是翻译反了……

另外这说的是在有多个匹配的重载的时候如何把参数变量的类型转化为实际参数的类型的匹配工作(overload resolution),不是讨论两个函数的签名是否一致。int是按值传递的,加const对于调用者来说没有任何效果——那个const是限制函数里那个实际参数的,对形式参数没有影响,所以int和const int对于编译器来说是同一个形式参数类型。


[解决办法]
确实是只有当参数是指针或引用时才能用const重载

[解决办法]
1. 翻译错了。
2. 主楼第一个例子无法形成重载,因为这他们的 function type 相同。

[解决办法]
翻译的问题C++函数满载的疑惑

[解决办法]
嗯,翻译的问题!
[解决办法]
关于const 重载几乎在所有c++的书中者提到过但大部分只是一句话,例如在《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”
但是这一段描述并没有给出引用、指针和值传递前加const的实质区别是什么。在用非const的指针,引用和值均可转化为const的。这一点没有太多可说明的东东。

对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。
[解决办法]
只有当形参是 指针 或者 引用 的时候,const 才能用来做重载区分

热点排行