C++关键字之mutable

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

1.先容

        在C++中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的修改并不影响对象的逻辑状态(比方缓存、计数器等)。这时可以使用 mutable来允许这些变量在常量成员函数中被修改。
2.特点

        (1)允许在常量成员函数中修改。mutable变量可以在常量成员函数中被修改,而普通成员变量不可。
        (2)不影响对象的逻辑状态。mutable通常用于那些不影响对象外部可见状态的变量,比方缓存、调试计数器等。
        (3)常量对象也可以修改mutable变量。即使对象是const的,mutable变量仍旧可以被修改。
3.使用语法

  1. class MyClass {
  2. public:
  3.     mutable int mutableVar; // 使用 mutable 修饰
  4.     int normalVar;
  5.     void modify() const {
  6.         mutableVar = 10; // 正确:mutable 变量可以在常量成员函数中修改
  7.         // normalVar = 20; // 错误:不能修改普通成员变量
  8.     }
  9. };
复制代码
4.使用场景

        (1)缓存数据
        如果某个成员变量用于缓存盘算结果,且盘算成本较高,可以使用mutable来允许在常量成员函数中更新缓存。
  1. class Cache {
  2. private:
  3.     mutable bool cacheValid;
  4.     mutable int cachedValue;
  5.     int expensiveCalculation() const {
  6.         // 模拟一个昂贵的计算
  7.         return 42;
  8.     }
  9. public:
  10.     Cache() : cacheValid(false), cachedValue(0) {} //成员初始化列表
  11.     int getValue() const {
  12.         if (!cacheValid) {
  13.             cachedValue = expensiveCalculation(); // 更新缓存
  14.             cacheValid = true;
  15.         }
  16.         return cachedValue;
  17.     }
  18. };
复制代码
        (2)调试或统计
        用于纪录函数调用次数等调试信息。
  1. class Logger {
  2. private:
  3.     mutable int callCount;
  4. public:
  5.     Logger() : callCount(0) {}
  6.     void log() const {
  7.         callCount++; // 记录调用次数
  8.         cout << "Log called " << callCount << " times" << endl;
  9.     }
  10. };
复制代码
5.注意事项

        (1)不要滥用mutable,因为它会粉碎常量成员函数的语义。只有在确实须要修改某些不影响对象逻辑状态的变量时才使用。
        (2)mutable不能用于修饰静态成员变量(static),因为静态成员变量不属于任何特定对象。

通过合理使用mutable,可以在保持常量成员函数语义的同时,机动地处置惩罚一些特殊情况。

如有错误,敬请指正!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表