一、const成员函数
class MyClass
{
public:
void fun() const
{
}
private:
int m_nValue;
}
const成员函数内不能修改成员变量的值,也不能调用非const成员函数。const对象只能调用const成员函数。
二、mutable关键字
class MyClass
{
public:
void Show()const;
private:
int m_value;
mutable int m_showCount;
};
MyClass::Show()
{
m_value=1;//错误,不能在const成员函数中修改普通变量
m_showCount++;//正确
};
mutable只能修饰非静态成员变量。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。
三、为什么要使用const和mutable
保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误的修改了类对象的状态。并且在所有使用该成员函数的地方都可以更准确的预测到使用该成员函数带来的影响。而mutable则是为了能够突破const的封锁线,让类的一些次要的或者辅助性的成员变量随时可以被更改。没有使用const和mutable关键字当然没有错,const和mutable关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担。