8. mutable 的用法
1. 用法
中文意思是易变的,可变的。
作用有两点:
- 保持常量对象中大部分数据成员仍然是“只读”的情况下,实现对个别数据成员的修改。
- 使 const 函数可修改对象的 mutable 数据成员。
注意两点:
- mutable 只能作用于类的非静态和非常量数据成员。
- 在一个类中,应尽量少用或者不用 mutable。
解释:
- mutable 和 const 意思相反,故不能修饰 const 数据成员。static 数据成员存储在 Data 段或 BSS 段,属于类,不属于类对象,所以 mutable 也不能修饰 static 数据成员。
- 对于常对象的数据成员,本不可以修改,若想修改,可以用 mutable 修饰。
#include <iostream>
using namespace std;class Person {string name; // 普通成员(不能被常对象修改)mutable int visitCnt; // mutable 修饰的成员(允许修改)public:Person(string n) : name(n), visitCnt(0) {}// const 成员函数:不能修改普通成员,但可以修改 mutable 成员void show() const {// name = "Jack"; // ❌ 编译错误,常对象不可修改普通成员visitCnt++; // ✅ 可以修改,因为 visitCnt 是 mutablecout << "Name: " << name<< ", visitCnt: " << visitCnt << endl;}
};int main() {const Person p("Tom"); // 定义一个常对象p.show(); // 第1次调用,visitCnt = 1p.show(); // 第2次调用,visitCnt = 2p.show(); // 第3次调用,visitCnt = 3return 0;
}