mutable学习

来源:互联网 发布:手拉鸡专卖网淘宝付款 编辑:程序博客网 时间:2024/04/30 12:01

 

关键字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.

原创粉丝点击