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.
阅读全文
0 0
- const与非const参数调用重载函数
- const 参数重载与const 成员函数重载
- const 和 非const函数重载
- const 和非 const 函数重载
- const 和 非const函数重载
- const与重载函数
- void*参数函数的const和非const重载函数版本
- const对象调用非const成员函数
- C++小知识:const成员函数与非const成员函数可以重载
- 顶层const、底层const、函数重载与const形参
- const&volatile 与函数重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- const和非const函数重载,mutable关键字
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 跨模态搜索(cross-modal/media retrieval)
- 正则表达式
- Python的set集合
- Quorom机制
- 《python网络爬虫——大学排名》
- const与非const参数调用重载函数
- 数据库 rbac 中的表
- springmvc session丢失 重新登录
- 跳台阶
- stm8——LED流水灯实现
- TX1上使用Faster-RCNN训练自己的训练集遇到的问题与解决
- 设计模式(一):简单工厂模式
- 动态语言
- [php学习笔记]与类有关的魔术方法、魔术常量、系统函数