mutable
在C++中,mutable 关键字的主要作用是允许类的成员变量在常量成员函数中被修改。常量成员函数是用 const 关键字修饰的成员函数,通常不允许修改类的成员变量。然而,有时我们希望在这些常量成员函数中修改某些特定的成员变量,比如缓存、调试信息等。为了实现这一需求,可以使用 mutable 关键字。
以下是 mutable 的几个主要作用:
-
允许在 const 成员函数中修改变量:
通过将类成员变量声明为 mutable,可以在常量成员函数中修改这些成员变量,而不会违反 const 约束。
-
便于实现懒加载和缓存:
在某些情况下,计算一个值可能是昂贵的操作。我们可以使用 mutable 关键字来存储缓存的结果,并在需要时更新它,即使是在 const 成员函数中。 -
便于调试信息的记录:
在调试时,我们可能希望在 const 成员函数中记录一些调试信息。可以使用 mutable 关键字来允许修改调试记录变量。
示例代码
下面是一个使用 mutable 关键字的示例:
#include <iostream>
#include <string>
class MyClass {
private:
std::string data;
mutable int accessCount; // 允许在 const 成员函数中修改
public:
MyClass(const std::string& str) : data(str), accessCount(0) {}
std::string getData() const {
++accessCount; // 修改 mutable 成员变量
return data;
}
int getAccessCount() const {
return accessCount;
}
};
int main() {
MyClass obj("Hello, World!");
std::cout << obj.getData() << std::endl;
std::cout << obj.getData() << std::endl;
std::cout << "Data accessed " << obj.getAccessCount() << " times." << std::endl;
return 0;
}
在这个示例中,MyClass 类有一个 mutable 成员变量 accessCount,用于记录 getData() 函数的调用次数。即使 getData() 是一个 const 成员函数,它仍然可以修改 accessCount 变量。运行这段代码时,会输出:
Hello, World!
Hello, World!
Data accessed 2 times.
使用 mutable 的注意事项
尽管 mutable 关键字很有用,但应谨慎使用。滥用 mutable 可能会使代码变得难以理解和维护。最好仅在确实需要修改成员变量且这种修改不会破坏类的逻辑一致性时才使用 mutable。
标签:std,const,变量,成员,修改,mutable,optional,函数 From: https://www.cnblogs.com/codeSweet/p/18327170