const与非const参数调用重载函数

来源:互联网 发布:手机淘宝可以买彩票吗? 编辑:程序博客网 时间:2024/06/05 03:06

先看一段小代码:

#include <iostream>using namespace std;void f(const int* ptr){cout<<"Calling const."<<endl;}void f(int* ptr){cout<<"Calling non-const."<<endl;}int main (){    int val=1;    const int* ptr=&val;    f(ptr);    return 0;}

输出会是什么呢?这似乎比较显然:

Calling const.

类似的,对于下面的代码:

#include <iostream>using namespace std;void f(const int* ptr){cout<<"Calling const."<<endl;}void f(int* ptr){cout<<"Calling non-const."<<endl;}int main (){    int val=1;    int* ptr=&val;    f(ptr);    return 0;}

我们也有这样的结果:

Calling non-const.

但如果以此类推到非指针类型上,也即是按值传递的函数时,又会怎么样呢

#include <iostream>using namespace std;void f(const int val){cout<<"Calling const."<<endl;}void f(int val){cout<<"Calling non-const."<<endl;}int main (){    int val=1;    f(val);    return 0;}

事实上,这段代码会报出编译错误

[Error] redefinition of ‘void f(int)’

对于const 的情况,其实也是一样的结果:

#include <iostream>using namespace std;void f(const int val){cout<<"Calling const."<<endl;}void f(int val){cout<<"Calling non-const."<<endl;}int main (){    const int val=1;    f(val);    return 0;}

输出同样为:

[Error] redefinition of ‘void f(int)’


分析


为什么传指针与传值出现了这样的差异呢?

在传指针的条件下,函数的原型实际上表明了函数能否修改指针所指向的值.所以当传入一个非const 指针时,就暗含了用户要改变指针所指向的值的意图.这时如果调用了const 函数,用户实际上就无法改变指针所指向的值,这就与用户的初衷相悖.反之,假如用户传入了const 指针,就更加不可能为之去调用非const 的函数了,因为const 指针所指向的值是受到了保护的,将它转化为非const 指针是非法的.因此C++做出这样的安排是完全合理的.

再来看在传值的情况下,无论用户传的是const 参数还是非const 参数,都不会影响参数原本的值.因此,编译器根本无法区分用户有什么样的意图,在它的视角里,传const 与非const 实质上是完全一样的,因此在这里const 仅仅起一个修饰作用,这两个函数的签名实际上是完全一致的.

同理,对于引用也有类似的结果.

    #include <iostream>using namespace std;void f(const int& ref){cout<<"Calling const."<<endl;}void f(int& ref){cout<<"Calling non-const."<<endl;}int main (){    int val=1;    const int& ref=val;    f(ref);    return 0;}

输出:

Calling const.
#include <iostream>using namespace std;void f(const int& ref){cout<<"Calling const."<<endl;}void f(int& ref){cout<<"Calling non-const."<<endl;}int main (){    int val=1;    int& ref=val;    f(ref);    return 0;}

输出:

Calling non-const.
原创粉丝点击