对于一个类中的函数来说,如果这个函数不会改变对象的状态,那么都应该将其声明为常成员函数。
可是,如果出现这样一种情况:
一个函数会改变某个成员对象的值,但它不改变对象状态,这时候也应该怎么做呢?
例如有一个animal类,类中有一个数据成员count专门用于统计animal对象的生育次数。容易理解的是,count的改变并不会改变animal对象的对象状态(即count与animal对象之间并无关系),它只记录animal执行“生育”这个成员函数的次数。
由于生育的过程是不变的,因此“生育”成员函数应被定义为一个常成员函数,然而我们无法在一个常成员函数中修改成员变量的,这时就用的上我们的mutable修饰符了。
在一个类中,被mutable修饰的成员对象在任何时候都不会被视为常对象。
也就是说添加了mutable修饰符的成员对象允许在常成员函数中被修改。
用法举例:
class Animal { public: Animal(); void birth() const { std::cout << "A child was born" << std::endl; birth++; } private: mutable int birth; };
像这样使用修饰成员对象就可以突破const的限制,也就是说,允许在常成员函数中,修改birth变量的值。
但是使用mutable会在一定程度上破坏const形成的语言包含机制,所以在使用上一定要把握好度,不能滥用。