C++中const用于函数重载
常成员函数和非常成员函数之间的重载
首先先回忆一下常成员函数
声明:<类型标志符>函数名(参数表)const;
说明:
(1)const是函数类型的一部分,在实现部分也要带该关键字。
(2)const关键字可以用于对重载函数的区分。
(3)常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数。
(4)非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数。
重载看例子:
#include<iostream> using namespace std; class Test { protected: int x; public: Test (int i):x(i) { } void fun() const { cout << "fun() const called " << endl; } void fun() { cout << "fun() called " << endl; } }; int main() { Test t1 (10); const Test t2 (20); t1.fun(); t2.fun(); return 0; }
结果为:
const修饰成员函数时的重载
分两种情况,一种情况下不允许重载,另一种允许。还是直接看例子吧:
#include<iostream> using namespace std; void fun(const int i) { cout << "fun(const int) called "; } void fun(int i) { cout << "fun(int ) called " ; } int main() { const int i = 10; fun(i); return 0; }
结果:编译错误,提示重定义:
其实很好理解:
void fun(int a)和
void fun(const int a);
实际上没有区别,因为函数调用的时候,存在形实结合的过程,所以不管有没有const都不会改变实参的值。
但是看下面的情况:
#include<iostream> using namespace std; void fun(char *a) { cout << "non-const fun() " << a; } void fun(const char *a) { cout << "const fun() " << a; } int main() { const char *ptr = "hello world"; fun(ptr); return 0; }
结果:通过编译,且输出结果为:
很奇怪是吗,这种情况和上面的情况难道不一样吗?
先别急,再来看一个例子。然后再解释。
#include<iostream> using namespace std; void fun(char *a) { cout << "non-const fun() " << a; } void fun(char * const a) { cout << "const fun() " << a; } int main() { char ptr[] = "hello world"; fun(ptr); return 0; }
结果:编译不通过,提示重定义:
好了,现在解释原因。
第一个例子中,我们说,fun(int i)和fun(const int i)是一样的,是因为函数调用中存在实参和形参的结合。加入我们用的实参是int a,那么这两个函数都不会改变a的值,这两个函数对于a来说是没有任何区别的,所以不能通过编译,提示重定义。
好了,那 fun(char *a)和fun(const char *a)是一样的吗?答案是:不一样。因为char *a 中a指向的是一个字符串变量,而const char *a指向的是一个字符串常量,所以当参数为字符串常量时,调用第二个函数,而当函数是字符串变量时,调用第一个函数。
但是char *a和char * const a,这两个都是指向字符串变量,不同的是char *a是指针变量 而char *const a是指针常量,这就和int i和const int i的关系一样了,所以也会提示重定义。
最后说一下,对于引用,比如int &i 和const int & i 也是可以重载的,原因是第一个i引用的是一个变量,而第二个i引用的是一个常量,两者是不一样的,类似于上面的指向变量的指针的指向常量的指针。
下面是例子:
#include<iostream> using namespace std; void fun(const int &i) { cout << "fun(const int &) called "<<endl; } void fun(int &i) { cout << "fun(int &) called "<<endl ; } int main() { const int i = 10; fun(i); return 0; }
结果为:
最后谢谢,水草的专栏
http://blog.csdn.net/shltsh/article/details/45939977
感谢分享
如果你觉得对你有用,请赞一个吧~~~
C++中const用于函数重载相关推荐
- C++:const用于函数重载
常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2 ...
- C++中的常成员函数以及const用于函数重载
1.什么是常成员函数? 在类中可以含有普通成员函数和静态成员函数,而使用 const修饰的普通成员函数称为 常成员函数 const修饰的是普通成员函数中的this指针指向的内存空间 类的普通成员函数中 ...
- c++中const与函数一起用的时候需要注意什么?
1. const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰 ...
- python中不需要函数重载的原因
函数重载主要是为了解决两个问题: 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函 ...
- const成员函数重载
除了常规的函数重载 在函数后加上一个const也可以实现重载,即使参数列表完全相同 调用时,根据对象的const性选择重载函数
- c++ 类 const成员函数重载
class AA { public: AA() { a =10; b =20; } int GetA() const //函数1 { cout << "GetA() const& ...
- C++ 中const的用法,特别是用在函数前面与后面的区别!
原文链接:https://www.cnblogs.com/doker/p/11051175.html 目录 第一:const修饰函数的参数 第二:用const修饰函数的返回值 第三:const 成员函 ...
- 美丽的闭包,在js中实现函数重载
引言 最近在js的学习中,看到了函数重载的问题,一开始,只看到了实现代码,看着代码冥思苦想了半个小时,总算是理清了其实现的原理,也为其实现的巧妙感到赞叹,也是在自己搞懂原理之后,去网络上搜索了下,才知 ...
- 高效学 C++|函数参数的引用传递和函数重载
在节前拜读张哥dvlinker的博客_CSDN博客-VC++常用功能代码封装,C++相关,C++软件调试与异常排查从入门到精通系列教程领域博主的C++专栏后,毅然决然,想在春节期间系统的学习下C++入 ...
最新文章
- 文本编辑器中实现设置工具栏和状态栏可见性的功能
- 免费送书送票 |《精益数据分析》短书评集赞送福利
- 嵌套游标以生成复杂的报表
- 高手如何实践HBase?不容错过的滴滴内部技巧
- sqoop数据导出导入命令
- keepalived安装及配置文件详解
- C#写文本写Csv文件操作
- Spring的注入方式中,官方推荐哪种方式
- excel数据库_从案例说excel如何实现数据库管理
- 【已解决】java int转byte出现负数
- 服务器发送 微信通知,方糖,使用微信通知的小接口
- 厦门理工学院OJ题解(1223:Rite与跳舞毯)
- 通信算法之六十:SC_FDE系统的物理层算法设计与工程实现
- 汉诺塔(河内塔)问题(递归)
- egg(一):创建一个egg项目
- 杭州市建筑工程师职称评审申报指南
- ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理
- 打破时间的束缚(转)
- Linux下JavaCv使用GPU加速(Nvidia显卡)
- 【Python】 plt.savefig保存图片时一片空白
热门文章
- 技术文:微信小程序和服务器通信-WebSocket
- JavaScript事件使用指南
- 工作流集成第三方jsp表单
- 2、Get和post的区别
- MOPSO 多目标粒子群优化算法
- MATLAB绘图笔记——画立方体的几种方法
- 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
- nginx在CDN加速或使用SLB代理后,获取真实IP,做并发访问限制的方法
- Linux——多线程
- 编译安装mysql5.6.16_CentOS 6.4下编译安装MySQL 5.6.16