一、修饰类成员变量
此关键字只能应用于类的非静态和非常量数据成员,mutable
是为了让 const
对象的某些数据成员可以被修改。static
是类的成员,不属于对象,常对象和常函数只会限制类的成员变量修改,所以类的 static
数据成员不需要 mutable
修饰,在常对象和常函数中也能被修改。
class Person{
public:
int getAge() const{
m_count++;
s_count++;
return m_age;
}
int getCount()const{
return m_count;
}
private:
int m_age{20};
mutable int m_count{0};
public:
static int s_count;
};
int Person::s_count = 0;
int main()
{
Person p;
p.getAge();
p.getAge();
p.getAge();
cout << p.getCount() << endl; // 3
cout << p.s_count << endl; // 3
return 0;
}
二、修饰匿名函数
表示可以修改按值传入的变量的副本(不是值本身),类似于不带 const
关键字的形参。使用 mutable
关键字后对按值传入的变量进行的修改,不会将改变传递到 Lambda 表达式之外。如果不加 mutable
关键字,按值传入的变量是只读的,即使在 Lambda
表达式内部也不可修改
int main () {
int x = 1;
int y = 1;
int z;
cout << "x1: " << x << "\t y1: " << y << endl;
z = [=]() mutable -> int
{
++x;
++y;
cout << "x2: " << x << "\t y2: " << y << endl;
return x + y;
}();
cout << "x3: " << x << "\t y3: " << y << endl;
cout << "z: " << z << endl;
return 0;
}
输出:
x1: 1 y1: 1
x2: 2 y2: 2
x3: 1 y3: 1
z: 4