前言:
mutable
关键字在 C++ 中具有特定的用途,但首先我们需要澄清一点:mutable
并不是用于定义变量类型的关键字,而是用于类的成员变量修饰。它允许一个类的常量成员函数(即使用const
修饰的成员函数)修改被mutable
修饰的成员变量。
一、mutable 关键字
1、作用
在 C++ 中,如果一个成员函数被声明为
const
,那么它不能修改类的任何成员变量(除非这些变量被声明为mutable
)。const
成员函数的目的是保证该函数不会修改对象的状态。然而,在某些情况下,我们可能需要在const
成员函数中修改某些成员变量。这就是mutable
关键字发挥作用的地方。
mutable
关键字告诉编译器,即使在const
成员函数中,也可以修改这个成员变量,而不会破坏对象的常量性。这通常用于那些不影响对象逻辑状态的变量,比如缓存、计数器或者用于延迟计算的变量。
2、示例
下面是一个简单的例子,展示了如何使用
mutable
关键字:
#include <iostream>
#include <string>
class MyClass {
private:
mutable int access_count; // 可以被 const 成员函数修改
std::string data;
public:
MyClass(const std::string& str) : data(str), access_count(0) {}
int getAccessCount() const { // const 成员函数
access_count++; // 在 const 成员函数中修改 mutable 成员变量
return access_count;
}
void setData(const std::string& str) {
data = str;
}
std::string getData() const {
return data;
}
};
int main() {
MyClass obj("Hello, World!");
std::cout << "Data: " << obj.getData() << std::endl;
std::cout << "Access count: " << obj.getAccessCount() << std::endl; // 输出 1
std::cout << "Access count: " << obj.getAccessCount() << std::endl; // 输出 2
return 0;
}
3、注意事项
虽然
mutable
关键字提供了在const
成员函数中修改成员变量的能力,但应谨慎使用。过度或不恰当的使用可能会破坏对象的封装性和不变性,导致代码难以理解和维护。通常,mutable
应仅用于那些确实需要在const
上下文中改变但其改变不影响对象逻辑状态的变量。