2013年2月19日 星期二

[C++ 文章收集] 深入理解C++中的mutable關鍵字

來源自 這裡 
Preface: 
mutalbe 的中文意思是“可變的,易變的”,跟 constant(既C++中的const)是反義詞。在C++中,mutable 也是為了突破 const 的限製而設置的。被mutable 修飾的變量,將永遠處於可變的狀態,即使在一個 const 函數中。我們知道,如果類的成員函數不會改變對象的狀態,那麼這個成員函數一般會聲明成 const 的。但是,有些時候,我們需要在 const 的函數里面修改一些跟類狀態無關的數據成員,那麼這個數據成員就可以使用 mutalbe 來修飾

下面是一個小例子: 
  1. class ClxTest  
  2. {  
  3.  public:  
  4.   void Output() const;  
  5. };  
  6.   
  7. void ClxTest::Output() const  
  8. {  
  9.  cout << "Output for test!" << endl;  
  10. }  
  11.   
  12. void OutputTest(const ClxTest& lx)  
  13. {  
  14.  lx.Output();  
  15. }  
類 ClxTest 的成員函數 Output 是用來輸出的,不會修改類的狀態,所以被聲明為 const 的. 函數OutputTest也是用來輸出的,裡面調用了對象 lx 的Output輸出方法,為了防止在函數中調用其他成員函數修改任何成員變量,所以參數也被 const 修飾. 

如果現在,我們要增添一個功能:計算每個對象的輸出次數。如果用來計數的變量是普通的變量的話,那麼在 const 成員函數 Output 裡面是不能修改該變量的值的;而該變量跟對象的狀態無關,所以應該為了修改該變量而去掉 Output 的 const 屬性。這個時候,就該我們的 mutable 出場了——只要用 mutable 來修飾這個變量,所有問題就迎刃而解了. 

下面是修改過的代碼: 
  1. class ClxTest  
  2. {  
  3.  public:  
  4.   ClxTest();  
  5.   ~ClxTest();  
  6.   
  7.   void Output() const;  
  8.   int GetOutputTimes() const;  
  9.   
  10.  private:  
  11.   mutable int m_iTimes;  
  12. };  
  13.   
  14. ClxTest::ClxTest()  
  15. {  
  16.  m_iTimes = 0;  
  17. }  
  18.   
  19. ClxTest::~ClxTest()  
  20. {}  
  21.   
  22. void ClxTest::Output() const  
  23. {  
  24.  cout << "Output for test!" << endl;  
  25.  m_iTimes++;  
  26. }  
  27.   
  28. int ClxTest::GetOutputTimes() const  
  29. {  
  30.  return m_iTimes;  
  31. }  
  32.   
  33. void OutputTest(const ClxTest& lx)  
  34. {  
  35.  cout << lx.GetOutputTimes() << endl;  
  36.  lx.Output();  
  37.  cout << lx.GetOutputTimes() << endl;  
  38. }  
计数器 m_iTimes 被 mutable 修饰,那么它就可以突破 const 的限制,在被 const 修饰的函数里面也能被修改!

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...