非静态类成员修饰符
此上下文中的 mutable
修饰符用于指示可以修改 const 对象的数据字段而不影响对象的外部可见状态。
如果你正在考虑缓存昂贵计算的结果,则应该使用此关键字。
如果你有一个锁定(例如,std::unique_lock
)数据字段,它在 const 方法中被锁定和解锁,那么这个关键字也是你可以使用的。
你不应该使用此关键字来破坏对象的逻辑常量。
缓存示例:
class pi_calculator {
public:
double get_pi() const {
if (pi_calculated) {
return pi;
} else {
double new_pi = 0;
for (int i = 0; i < 1000000000; ++i) {
// some calculation to refine new_pi
}
// note: if pi and pi_calculated were not mutable, we would get an error from a compiler
// because in a const method we can not change a non-mutable field
pi = new_pi;
pi_calculated = true;
return pi;
}
}
private:
mutable bool pi_calculated = false;
mutable double pi = 0;
};