深入理解C++中的mutable关键字

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

  下面是一个小例子:

class ClxTest
{
 public:
  void Output() const;
};

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
}

void OutputTest(const ClxTest& lx)
{
 lx.Output();
}

  类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。

  函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

  如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。

  下面是修改过的代码:

class ClxTest
{
 public:
  ClxTest();
  ~ClxTest();

  void Output() const;
  int GetOutputTimes() const;

 private:
  mutable int m_iTimes;
};

ClxTest::ClxTest()
{
 m_iTimes = 0;
}

ClxTest::~ClxTest()
{}

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
 m_iTimes++;
}

int ClxTest::GetOutputTimes() const
{
 return m_iTimes;
}

void OutputTest(const ClxTest& lx)
{
 cout << lx.GetOutputTimes() << endl;
 lx.Output();
 cout << lx.GetOutputTimes() << endl;
}

  计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。

转载于:https://blog.51cto.com/mingtangduyao/1708688

深入理解C++中的mutable关键字 ​相关推荐

  1. 深入理解C++中的mutable关键字

    mutable的中文意思是"可变的,易变的",跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutabl ...

  2. 深入理解Java中的final关键字

    深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...

  3. 如何理解 JAVA 中的 volatile 关键字

    如何理解 JAVA 中的 volatile 关键字 最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂. ...

  4. 深入理解C++中的explicit关键字

    深入理解C++中的explicit关键字 kezunhai@gmail.com http://blog.csdn.net/kezunhai C++中的explicit关键字只能用于修饰只有一个参数的构 ...

  5. C++中的mutable关键字

    mutalbe的中文意思是"可变的,易变的",跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutabl ...

  6. C++ 中的mutable关键字

    文章转自:https://blog.csdn.net/liyuanbhu/article/details/50365287 版权归原作者! 在C++中,mutable 是为了突破 const 的限制而 ...

  7. JAVA中的this怎么理解_Java中的this关键字怎么理解?

    一.this关键字主要有三个应用: (1)this调用本类中的属性,也就是类中的成员变量: (2)this调用本类中的其他方法: (3)this调用本类中的其他构造方法,调用时要放在构造方法的首行. ...

  8. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  9. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

最新文章

  1. invalid project description._[Project教程] 在Project软件中如何处理加班工时
  2. 【青少年编程】黄羽恒:Python
  3. nodejs安装node-rsa遇到的问题及解决
  4. docker容器的标准使用过程_跟我一起学docker(四)--容器的基本操作
  5. vue,一路走来(10)--生产环境
  6. Elasticsearch教程 IK分词器安装
  7. 使用Oracle验证外部数据
  8. 小程序FMP优化实录,大厂面试题汇总
  9. c#winform演练 ktv项目 点击歌单行 可以播放对应的歌曲
  10. 中livechart显示大数据_Kaggle 大数据竞赛中的Tricks总结
  11. 概率论与数理统计(二)选择题
  12. mysql和hdfs性能对比,Hadoop vs Spark性能对比 -数据库-火龙果软件工程
  13. java获取上个月15号_java获取当前上一周、上一月、上一年的时间
  14. Mysql索引优化和锁机制
  15. python xlrd读取excel慢_与xlrd相比,使用openpyxl读取Excel文件要慢很多
  16. 数据包络分析——二阶段网络带feedback
  17. 随机画五十个圆python_随的解释|随的意思|汉典“随”字的基本解释
  18. Salesforce: 关于Apexpages.Message类
  19. 常见的压力面试题及面试技巧
  20. 01-SNAP与snappy介绍及安装

热门文章

  1. python脚本 通过rsa private key 生成 publickey
  2. 基础才是重中之重~何为原子化操作
  3. 不要一辈子都指望用技术赚钱
  4. 使用jQuery实现ajax几种方法
  5. open***无法启动日志报错解决方法
  6. 关于Action返回结果类型的事儿(下)
  7. mysql M/S配置小记
  8. Junit中error和failure区别
  9. 如何配置三层交换机创建VLAN 2
  10. 精读《手写 SQL 编译器 - 错误提示》