常成员函数和非常成员函数之间的重载

首先先回忆一下常成员函数

声明:<类型标志符>函数名(参数表)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用于函数重载相关推荐

  1. C++:const用于函数重载

    常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2 ...

  2. C++中的常成员函数以及const用于函数重载

    1.什么是常成员函数? 在类中可以含有普通成员函数和静态成员函数,而使用 const修饰的普通成员函数称为 常成员函数 const修饰的是普通成员函数中的this指针指向的内存空间 类的普通成员函数中 ...

  3. c++中const与函数一起用的时候需要注意什么?

    1. const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰 ...

  4. python中不需要函数重载的原因

    函数重载主要是为了解决两个问题: 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函 ...

  5. const成员函数重载

    除了常规的函数重载 在函数后加上一个const也可以实现重载,即使参数列表完全相同 调用时,根据对象的const性选择重载函数

  6. c++ 类 const成员函数重载

    class AA { public: AA() { a =10; b =20; } int GetA() const //函数1 { cout << "GetA() const& ...

  7. C++ 中const的用法,特别是用在函数前面与后面的区别!

    原文链接:https://www.cnblogs.com/doker/p/11051175.html 目录 第一:const修饰函数的参数 第二:用const修饰函数的返回值 第三:const 成员函 ...

  8. 美丽的闭包,在js中实现函数重载

    引言 最近在js的学习中,看到了函数重载的问题,一开始,只看到了实现代码,看着代码冥思苦想了半个小时,总算是理清了其实现的原理,也为其实现的巧妙感到赞叹,也是在自己搞懂原理之后,去网络上搜索了下,才知 ...

  9. 高效学 C++|函数参数的引用传递和函数重载

    在节前拜读张哥dvlinker的博客_CSDN博客-VC++常用功能代码封装,C++相关,C++软件调试与异常排查从入门到精通系列教程领域博主的C++专栏后,毅然决然,想在春节期间系统的学习下C++入 ...

最新文章

  1. 文本编辑器中实现设置工具栏和状态栏可见性的功能
  2. 免费送书送票 |《精益数据分析》短书评集赞送福利
  3. 嵌套游标以生成复杂的报表
  4. 高手如何实践HBase?不容错过的滴滴内部技巧
  5. sqoop数据导出导入命令
  6. keepalived安装及配置文件详解
  7. C#写文本写Csv文件操作
  8. Spring的注入方式中,官方推荐哪种方式
  9. excel数据库_从案例说excel如何实现数据库管理
  10. 【已解决】java int转byte出现负数
  11. 服务器发送 微信通知,方糖,使用微信通知的小接口
  12. 厦门理工学院OJ题解(1223:Rite与跳舞毯)
  13. 通信算法之六十:SC_FDE系统的物理层算法设计与工程实现
  14. 汉诺塔(河内塔)问题(递归)
  15. egg(一):创建一个egg项目
  16. 杭州市建筑工程师职称评审申报指南
  17. ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理
  18. 打破时间的束缚(转)
  19. Linux下JavaCv使用GPU加速(Nvidia显卡)
  20. 【Python】 plt.savefig保存图片时一片空白

热门文章

  1. 技术文:微信小程序和服务器通信-WebSocket
  2. JavaScript事件使用指南
  3. 工作流集成第三方jsp表单
  4. 2、Get和post的区别
  5. MOPSO 多目标粒子群优化算法
  6. MATLAB绘图笔记——画立方体的几种方法
  7. 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
  8. nginx在CDN加速或使用SLB代理后,获取真实IP,做并发访问限制的方法
  9. Linux——多线程
  10. 编译安装mysql5.6.16_CentOS 6.4下编译安装MySQL 5.6.16