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; // 错误:不能组合使用
};
评论区