在下面的代码中a1调用const版本,a2调用非const版本。const a a1;
a a2;
a1.x();
a2.x();后面加const表示在该函数中不能对类的数据成员进行改变,比如:class A
{
private:int aa;
public:int x()
{return aa++;
} //这可以
int x() const
{
return aa++;//这错误
}
};
当然有特殊情况,就是用mutable关键字修饰过的成员变量可以在声明为const 函数中被改变。
关于mutable:关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化! 如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了例如:class Demo{public:Demo(){}~Demo(){}public:bool getFlag() const{m_nAccess++;return m_bFlag;}private:int m_nAccess;bool m_bFlag;}; int main(){return 0;}编译上面的代码会出现 error C2166: l-value specifies const object的错误说明在const类型的函数中改变了类的非静态数据成员.这个时候需要使用mutable来修饰一下要在const成员函数中改变的非静态数据成员m_nAccess,代码如下:class Demo{public:Demo(){}~Demo(){}public:bool getFlag() const{m_nAccess++;return m_bFlag;}private:mutable int m_nAccess;bool m_bFlag;}; int main(){return 0;}这样再重新编译的时候就不会出现错误了!

再看为String类实现的[]操作符重载函数:

char& operator[](int posion)    // function_1{return data[posion];};
注意,这里该函数的返回值为一个引用,否则str[0] = 'c'这样的语句就会不合法,因为str[0]将是一个左值。

那么,是否提供这样一个function_1就足够了呢?看下面这段代码: const String str= "She"; char c = str[0]; // 错误!编译提示:error C2678: 二进制“[” : 没有找到接受“const String”类型的左操作数的运算符(或没有可接受的转换)

很显然,我们必须还要为const String提供一个const版本的opeartor[]。如下: char& operator[](int posion) const { return data[posion]; } 这样,当使用const的String对象使用[]操作符时,便会调用该const的重载版本。 但是,这样就OK了嘛?虽然上面的那段代码没有问题了,但是其中却隐藏了一个陷阱,看如下代码: const String str = "She"; str[0] = 'T'; 上面这段代码可以编译,运行通过,str变为了"The"!而str声明为const的!!

现在,你应该知道了,对于const的该操作符重载函数其返回值也应该是const的,否则就会出现可以通过其修改const对象的漏洞。修改如下: const char& operator[](int posion) const { return data[posion]; } 好了,现在没有问题了!

我们再回过头来看一下,为了给String提供一个[]操作符来读写指定位置的字符,需要提供如下两个函数,以分别对非const String对象和const String对象提供支持: char& operator[](int posion) { return data[posion]; };

const char& operator[](int posion) const { return data[posion]; }

转载于:https://www.cnblogs.com/lidan/archive/2011/07/16/2239512.html

const 和 非const函数重载相关推荐

  1. c语言const 转为非const的问题

    昨天碰到一个奇葩的问题. 我定义的数据结构 struct tree {tree* left;tree* right; } 然后我用priorityqueue< tree>载入进去.但是这个 ...

  2. c++ const 转 非const

    #include "mainwindow.h" #include <QApplication> #include <QtDebug>void fun(con ...

  3. 类的const和非const成员函数的重载

    我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char). 只要了解过C++的操作符重载的语法,很快就可以写出下面这个[]操作符重载 ...

  4. 成员函数对象类的const和非const成员函数的重载

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 1. 类的const成员函数与非const成员函数的载重 #include <iostream> #include <st ...

  5. c++ const 转非const

    #include <iostream> #include <stdio.h> using namespace std;struct DexHeader{int off; }; ...

  6. 类中const函数及非const函数的调用规则

    转自:点击打开链接 类中const函数及非const函数的调用规则 class Student { public:int getAge(){return m_age;}int getAge() con ...

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

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

  8. C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用

    1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...

  9. c++ const对象和const函数

    关于const对象和const函数的分析 基本知识: 1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数 ...

  10. const参数,const返回值与const函数

    在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的: const  int  n=3; 则这个变量的值不能被修改,即不能对变量赋值. const 这个关键字 ...

最新文章

  1. STL源码剖析之算法:lower_bound
  2. SpringBoot实用小技巧之动态设置SpringBoot日志级别
  3. paperclip的id partition功能还是相当的给力,省得我们实现了,这个功能之前连想都没想到,...
  4. python手机版ios-iOS 项目中如何使用 Python
  5. Linux文件锁flock
  6. sql(join on 和where的执行顺序
  7. KlayGE的Virtual Texturing技术定名
  8. python 描述_python描述符
  9. 21 个 curl 命令练习 | Linux 中国
  10. MVC基础知识2——过滤器的使用(Filter)
  11. python爬虫——与不断变化的页面死磕和更新换代(3)
  12. 洛谷 P2804 神秘数字
  13. VS2017产品秘钥
  14. 华为星环大数据_星环大数据平台介绍,盘点星环大数据和华为大数据
  15. LFS详细搭建指南——适合初学者使用
  16. win7计算机资源管理器卡住,Win7电脑资源管理器一直卡住怎么办_Win7电脑资源管理器一直卡住的解决方法 - 系统家园...
  17. 爬虫模拟用户增加阅读量
  18. Android 传感器之《加速传感器》——摇一摇功能
  19. java画满天星_上机题目(初级)- 绘制满天星(Java)
  20. 芯片SIAT-002测试PCB板设计

热门文章

  1. 图神经网络(GCN)
  2. python数字图像处理(6):图像的批量处理
  3. scrapy猫眼爬虫
  4. python实践统计学中的三大相关性系数,并绘制相关性分析的热力图
  5. c语言crc校验库函数,CRC校验原理及其C语言实现
  6. java IDEA 修改jar包中某个文件 并生成新jar包
  7. 基于SSH的共享笔记系统
  8. mysql查询报错2014_MySQL错误2014的原因其他未缓冲的查询处于活动状态时无法执行查询...
  9. Web(4)servlet
  10. Servlet chapter 2