C++中只读函数以及mutable关键字的使用
在我之前写的一篇博客https://www.cnblogs.com/wphl-27/p/17395066.html (C++中类成员函数参数前const,返回值前加const 以及 函数声明后面加const作用及区别)
中说明了在C++中, 在函数后面加上const修饰符的,是只读函数, 比如如下面的函数:
void TestClass::Output() const { cout << "Output for test!" <<end1; }
上面TestClass类中的这个Output函数,我们在函数名Output()后面加上关键字const,来表明它是一个只读函数
之前的那篇博客中,我们提到: 我们把类的一个成员函数设置为只读函数, 这意味着,这个成员函数它不会去改变这个类的实例化后的对象的状态,也就是说类的只读成员函数(有时,也叫 “”常成员函数“”),它不会改变对象的内部状态
那么,什么是类实例化后的对象的内部状态呢 => 说的直白点,它就是指对象的成员变量,只读成员函数不能修改对象的内部状态,也就是不能修改这个对象的成员变量. 举个例子:
class TestClass { public: TestClass(); ~TestClass(); void Output() const; private: int m_iTimes; } void TestClass::Output() const { cout << "Output for test!" <<end1; m_iTimes++; //这里会报错, }
上面代码中, m_iTimes是类TestClass的成员变量, 而Output函数时一个只读成员函数,它里面不能改变对象的内部状态,也就是不能改变对象的成员变量的值,所以,在它里面去改变m_iTimes的值是不对的,会报错。
但是,在实际的项目开发中,我们有时候需要定义一个类的成员函数为只读成员函数, 但是在这个只读成员函数里面,需要去修改一些和类(对象)状态无关的数据成员, 也就是说我们要在一个只读成员函数里面,去修改这个类的某个成员变量(按道理来讲是不能修改),我们认为这个成员变量和对象状态无关(只读成员函数不能修改对象状态(对象的成员变量),但是又要能够修改这个成员变量, 所以我们必须设置这个成员变量,让它不属于对象的内部状态), 那么怎么来表示这个类的成员变量,不属于对象的内部状态呢 => 这个时候,需要使用关键字mutable来修饰这个成员变量
mutable => 字面意思就是"可变的",顾名思义, 就是说它修饰的成员变量,是可变的, 即使是在只读成员函数中,也可以修改它的值 => 我们认为用它来修饰的成员变量,不属于对象的内部状态
所以类的只读成员函数 => 不能修改对象的内部状态,也就是对象的成员变量 => 不能修改对象的内部状态,但是可以修改mutable修饰的成员变量,因为mutable修饰的成员变量不属于对象的内部状态
看下面的例子:
class TestClass { public: TestClass(); ~TestClass(); void Output() const; private: int m_iTimes; mutable int m_na; } void TestClass::Output() const { cout << "Output for test!" <<end1; m_iTimes++; //这里会报错, m_na++; //这个是可以的,这里不会报错 }