关键字mutable
1. mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
2. 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
3. 如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutable来修饰。
用法一:
例子:
class ClxTest
{
public:
void Output() const;
};
void ClxTest::Output() const
{
cout << "Output for test!" << endl;
}
void OutputTest(const ClxTest& lx)
{
lx.Output();
}
如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
修改过的代码:
class ClxTest
{
public:
ClxTest();
~ClxTest();
void Output() const;
int GetOutputTimes() const;
private:
mutable int m_iTimes;
};
ClxTest::ClxTest()
{
m_iTimes = 0;
}
ClxTest::~ClxTest()
{}
void ClxTest::Output() const
{
cout << "Output for test!" << endl;
m_iTimes++;
}
int ClxTest::GetOutputTimes() const
{
return m_iTimes;
}
void OutputTest(const ClxTest& lx)
{
cout << lx.GetOutputTimes() << endl;
lx.Output();
cout << lx.GetOutputTimes() << endl;
}
用法二:
struct A
{
int a;
mutable int b;
};
int main(int argc, char** argv)
{
const A object = {10,20};
object.b = 30;
cout << object.b << endl;
return 0;
}
面试题:
Please interpret the functionality of three "const" in the following method declaration:
const int* computeResult( const int& var ) const;
1> A function that returns a constant int pointer.
pointer to constants. The value that pointer point to can't be modified(*p can't be modified)
2> A function that accepts a constant pointer parameter
The parameter can't be modified in the function.
3> Constant member function. The member variables (non-constant and constant ) cann't be modified by the function. ( 但是可以访问非const变量,不能访问非const的函数 )
Const function must be a member function of a class
We may pass a non-constant object to a constant function, but we cannot pass a constant object to a non-constant function.
Constant function can invoke constant function only, can`t invoke non-constant function.