1.82、C++ mutable 的作用
C++中mutable
关键字的作用是允许类的非静态数据成员在const
成员函数中被修改,从而突破const
成员函数对对象状态不可变的限制。具体来说:
一、背景
const
成员函数承诺不修改对象的任何非mutable
成员,保证对象状态不变,便于代码的逻辑推理和优化。但在某些场景下,仍需在const
函数中修改某些辅助性或缓存性质的成员变量,这时mutable
就派上用场。
二、核心作用
被mutable
修饰的成员变量即使在const
成员函数中也可以被修改,不影响const
函数的语义完整性。它允许程序员将“逻辑上不变”的对象状态与“物理上可变”的辅助数据区分开。
三、典型应用场景
- 1. 统计与缓存
- • 记录函数调用次数、缓存计算结果(惰性求值)等不影响对象核心逻辑的状态变更。
- 2. 多线程同步
- • 修饰
std::mutex
等同步原语,允许在const
函数中进行加锁/解锁操作,保证线程安全。
- • 修饰
- 3. 延迟初始化与日志
- • 在
const
函数中完成资源的首次初始化或记录操作日志,不改变对象逻辑状态。
- • 在
四、示例代码
class Person {
public:
int getAge() const {
++callCount; // mutable允许在const函数中修改
return age;
}
int getCallCount() const { return callCount; }
private:
int age = 30; // 核心数据(不可变)
mutable int callCount = 0; // 辅助统计变量(可变)
};
五、使用限制
- 1. 修饰范围
- • 只能用于非静态数据成员,不能修饰
static
成员或成员函数。
- • 只能用于非静态数据成员,不能修饰
- 2. 与
const
冲突- • 不能修饰
const
成员(二者语义矛盾)。
- • 不能修饰
- 3. 线程安全
- • 不保证多线程安全,需配合同步机制(如锁)使用。
六、总结
mutable
关键字为C++的const
机制提供了灵活性,允许在保证对象逻辑不变性的前提下修改辅助成员,提升代码设计的表达能力。其核心价值体现在缓存计算、统计计数和多线程同步等场景中,但需注意其适用范围和局限性。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1784
文章版权归作者所有,未经允许请勿转载。
THE END