1. mutable关键字:突破const限制的成员变量
在C++中,mutable是一个常被忽视但极其有用的关键字。它允许我们在const成员函数中修改被标记为mutable的成员变量,这在特定场景下非常实用。
1.1 mutable的基本用法
mutable的语法非常简单,只需要在成员变量声明前加上这个关键字:
cpp复制class Example {
public:
void constMethod() const {
mutableVar = 42; // 可以在const方法中修改
// normalVar = 42; // 错误!不能修改普通成员变量
}
private:
mutable int mutableVar;
int normalVar;
};
这种设计看似违反了const的不变性原则,但实际上它有着合理的应用场景。mutable主要用于那些逻辑上不属于对象状态的变量,比如缓存、调试信息、引用计数等。
1.2 mutable的典型应用场景
1.2.1 缓存计算结果
当我们需要在const方法中缓存计算结果时,mutable就派上用场了:
cpp复制class ExpensiveCalculation {
public:
double getResult() const {
if (!calculated) {
// 实际计算过程
result = /* 复杂计算 */;
calculated = true;
}
return result;
}
private:
mutable double result;
mutable bool calculated = false;
};
1.2.2 线程安全的计数器
在多线程环境中,mutable可以用于不影响对象逻辑状态的计数器:
cpp复制class ThreadSafeObject {
public:
void doSomething() const {
std::lock_guard<std::mutex> lock(mtx);
callCount++; // 修改mutable变量
// 实际工作
}
size_t getCallCount() const { return callCount; }
private:
mutable std::mutex mtx;
mutable size_t callCount = 0;
};
注意:虽然mutable允许在const方法中修改变量,但这并不意味着可以滥用。它应该只用于那些不影响对象逻辑状态的变量。
1.3 mutable的注意事项
-
不要滥用mutable:过度使用mutable会破坏const的正确性保证,使代码更难理解和维护。
