目 录CONTENT

文章目录

C++ mutable

TalentQ
2025-09-13 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

1 概念

mutable 关键字用于声明一个类的成员变量,表示该变量即使在 const 成员函数中也可以被修改。这打破了常规的 const 成员函数不能修改类成员的限制。

class ClassName {
    mutable type member_name;
    // ...
};

2 使用场景

2.1 在 const 成员函数中修改状态

最常见的用法是当类有需要缓存的计算结果或内部状态时,即使对象是 const 的,也需要更新这些状态。

class Cache {
 private:
  mutable bool cache_valid(false);
  mutable int cached_value;
  int expensive_computation() const; // 实际计算函数

 public:
  int get_value() const {
    if (!cahce_valid) {
      cached_value = expensive_computation(); // 在 const 函数中修改 mutable 成员
      cache_valid = true;
    }
    return cached_value;
  }

  void invalidate_cache() const { // 即使是 const 函数
    cache_valid = false; // 可以修改 mutable 成员
  }
};

2.2 线程同步

在多线程环境中,即使成员函数是 const 的,也可能需要修改互斥锁或原子变量。

#include <mutex>

class ThreadSafeContainer {
 public:
  void access_data() const {
    std::lock_guard<std::mutex> lock(mtx_); // 在 const 成员函数中修改 mutex 的状态
  }

 private:
  mutable std::mutex mtx_; // mutable 允许在 const 成员函数中加锁
};

2.3 日志记录和调试

即使在 const 操作中,也可能需要记录日志或调试信息。

class Document {
private:
    mutable int access_count{0}; // 记录访问次数
    // 文档内容...
    
public:
    void display() const {
        access_count++; // 在const函数中修改计数
        // 显示文档内容
    }
    
    int get_access_count() const { return access_count; }
};

3 不能用于静态成员

mutable 不能用于静态成员变量,因为静态成员不属于任何特定对象实例。

class Example {
    // static mutable int count; // 错误:不能组合使用
};

0

评论区