讲mutable前,先讲一下const函数,讲const函数前,先讲一下函数前后加const的区别

一、C++函数前后加const的区别

  1)函数前加const:普通函数或非静态成员函数前均可加const修饰,表示函数的返回值为const,不可修改(主要是用于类的指针变量),格式为

    const RetunType FuncitonName(param list)

  2)函数后加const:类的非静态成员函数可加const修饰,函数为只读成员函数,成员变量为只读。

    ReturnType FunctionName(param list) const

  注:C++编译器在实现const的成员函数时,为了确保该函数不能修改类的实例状态,会在函数中添加一个隐式的参数const this,

    这样类的成员变量的值,即成员变量为read only。

二、mutable关键字

  mutable(易变的)是 C++ 中一个不常用的关键字。只能用于类的非静态和非常量数据成员。由于一个对象的状态由该对象的非静态数据成员决定,

  所以随着数据成员的改变,对象的状态也会随之发生变化。如果一个类的成员函数被声明为 const 类型,表示该函数不会改变对象的状态,也就是该

  函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值,这个时候就需要用到 mutable 关键字,如:

  #include <iostream>

  using namespace std;

  class Student

  {

  public:

    Student() {}

    int setAge(int age) const  {this->age = age;}  //错误:int age前面加mutable关键字修饰符即可以编译通过

         int SetAge(int age)  {this->age = age;}

      int getAge() const   {return this->age;}

      int GetAge()  {return this->age;}

  private:

    int age;

  }

  

  int main()

  {

    const Student s1;  //const对象

    int age = s1.getAge();//错误:const对象只能调用后const成员函数

    Student s2;     //非const对象

    age = s2.getAge(); //调用const成员函数,正确

    age = s2.GetAge();//调用非const成员函数,正确

    

    return 0;

  }

三、总结

  1、后const成员函数中可以改变类的mutable类型的成员变量。

  2、const对象只能调用后const成员函数。

  3、非const对象既可以调用后const成员函数,又可以调用非const成员函数。

最新文章

  1. Util应用程序框架公共操作类(六):验证扩展
  2. 使用uwsgi 部署python web服务
  3. 在springmvc中使用hibernate-validate
  4. ossec 常用命令及目录说明
  5. Java 判断是否为汉字 判断是否为乱码 判断字符串是否为双整型数字 整数 数字
  6. 【网络流24题】No. 17 运输问题 (费用流)
  7. ARC内存使用注意事项
  8. Install MongoDB on Linux Systems 速记
  9. 线程的同步控制(Synchronization)
  10. 第一个Appium脚本
  11. [CNN] Tool - Deep Visualization
  12. Spring-Session实现Session共享实现原理以及源码解析
  13. js函数事件对象
  14. Ubuntu 16.04安装Oracle 11gR2入门教程图文详解
  15. 什么是“HTML”?HTML的“标记”是什么?
  16. java 去最后一位字符 str.substring(0,str.length()-1)
  17. Android应用程序访问linux驱动第一步:实现并测试Linux驱动
  18. java程序计算数独游戏
  19. J2EE的十三种技术——JDBC
  20. simple--factory--abstract

热门文章

  1. Seekbar扩大点击区域
  2. eclipse的版本代号
  3. DIV 设置垂直居中
  4. idea2019.2激活至2089年!
  5. 3种常见的CSS页面布局--双飞翼布局、粘连布局、左右两列布局
  6. 如何处理 Web 图片优化?
  7. python应用-使用python控制win2003服务器
  8. Unity生成的WebGL如何在浏览器中运行
  9. laravel5.1学习1-Model的创建
  10. qq音乐解析API