深入理解C++中的mutable关键字

来源:互联网 发布:用php做购物网站案例 编辑:程序博客网 时间:2024/05/17 08:33

mutalbe的中文意思是“可变的,易变的”,跟constant(即C++中的const)是反义词。

 

   在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

  

  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

 

  下面是一个小例子: 

 

view sourceprint?
01class ClxTest 
02{  
03public
04    void Output() const;  
05}; 
06  
07    
08void ClxTest::Output() const 
09{  
10 cout << "Output for test!" << endl; 
11
12  
13    
14void OutputTest(const ClxTest& lx)  
15
16 lx.Output();  
17}

ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。函数OutputTest也是用来输出的,里面调用了对象lxOutput输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

   如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Outputconst属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。

 

   下面是修改过的代码:

view sourceprint?
01class ClxTest 
02
03 public:  
04  ClxTest(); 
05  ~ClxTest(); 
06    
07  void Output() const
08  int GetOutputTimes() const;   
09  
10 private
11    mutable int m_iTimes;  
12}; 
13  
14  
15ClxTest::ClxTest() 
16
17 m_iTimes = 0;  
18
19  
20  
21ClxTest::~ClxTest() 
22{
23
24  
25  
26void ClxTest::Output() const 
27
28    cout << "Output for test!" << endl; 
29    m_iTimes++; 
30
31  
32  
33int ClxTest::GetOutputTimes() const 
34
35    return m_iTimes;  
36
37  
38   
39void OutputTest(const ClxTest& lx) 
40
41 cout << lx.GetOutputTimes() << endl;  
42 lx.Output(); 
43 cout << lx.GetOutputTimes() << endl; 
44}  
45  
46计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改

 

 

原创粉丝点击