mutable是C++中的一个关键字,它允许在常量成员函数(const成员函数)中修改特定的成员变量,而不破坏对象的常量性。
C中没有类,自然也没有mutable关键字。
举个例子说明mutable的存在意义,比如你在展览一个非常珍贵的花瓶(一个C++类的对象),容不得对这个花瓶有半点改变,无论颜色、形状还是材质(成员变量)。但是,你希望记录下花瓶被多少人看过(访问次数),于是在花瓶上贴个标签(成员变量),在上面更新访问信息。显然,这个标签并不会影响到花瓶本身,无伤大雅,这就叫不破坏对象的常量性。
为了保证这个花瓶本身不改变,你设置了一套禁令(由const领衔主演的常量成员函数):不能在花瓶上涂鸦,不能用于烧烤,不能用作尿壶。这个常量成员函数保证不会修改对象中的成员变量,只有用mutable修饰的除外。
示例代码:
#include <iostream>
using namespace std;
class Vase {
private:
string color; // 花瓶颜色,不能改变
mutable int viewCount; // 访问次数,可改变
public:
Vase(const string& c) : color(c), viewCount(0) {}
// const成员函数,用于参观花瓶并增加访问次数
void view() const {
++viewCount; // 由于viewCount是mutable的,所以可以在const函数中修改它
// 注意:不能在const函数中改变color成员变量,因为它不是mutable的
// 下面的试图更改花瓶颜色的代码会导致编译错误(如果取消注释)
// color = "Green";
cout << "Viewed a " << color << " vase. Total views: " << viewCount << endl;
}
};
int main() {
Vase myVase("Blue"); //定义一个蓝色花瓶
// 参观花瓶(const函数),每参观一次增加一次访问次数
myVase.view();
myVase.view();
return 0;
}
倘若某位大佬在参观时强列表示:要想艺术过得去,瓶子必须带点绿。那也很好办,只需撤掉主演const,就可以随意涂鸦了。
综上,mutable主要用于在不改变对象主要属性的前提下,更新一些额外信息。