C++的const類成員函數


轉自:http://blog.csdn.net/lihao21/article/details/8634876

 

 

 我們知道,在C++中,若一個變量聲明為const類型,則試圖修改該變量的值的操作都被視編譯錯誤。例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. const char blank = ‘’;  
  2. blank = ‘\n’;  // 錯誤  

 

        面向對象程序設計中,為了體現封裝性,通常不允許直接修改類對象的數據成員。若要修改類對象,應調用公有成員函數來完成。為了保證const對象的常量性,編譯器須區分不安全與安全的成員函數(即區分試圖修改類對象與不修改類對象的函數)。例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. const Screen blankScreen;  
  2. blankScreen.display();   // 對象的讀操作  
  3. blankScreen.set(‘*’);    // 錯誤:const類對象不允許修改  

 

        在C++中,只有被聲明為const的成員函數才能被一個const類對象調用。

        要聲明一個const類型的類成員函數,只需要在成員函數參數列表后加上關鍵字const,例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. class Screen {  
  2. public:  
  3.    char get() const;  
  4. };  

 

        在類體之外定義const成員函數時,還必須加上const關鍵字,例如

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. char Screen::get() const {  
  2.    return _screen[_cursor];  
  3. }  

 

        若將成員成員函數聲明為const,則該函數不允許修改類的數據成員。例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. class Screen {  
  2. public:  
  3. int ok() const {return _cursor; }  
  4. int error(intival) const { _cursor = ival; }  
  5. };  

 

        在上面成員函數的定義中,ok()的定義是合法的,error()的定義則非法。

        值得注意的是,把一個成員函數聲明為const可以保證這個成員函數不修改數據成員,但是,如果據成員是指針,則const成員函數並不能保證不修改指針指向的對象,編譯器不會把這種修改檢測為錯誤。例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. class Name {  
  2. public:  
  3. void setName(const string &s) const;  
  4. private:  
  5.     char *m_sName;  
  6. };  
  7.   
  8. void setName(const string &s) const {  
  9.     m_sName = s.c_str();      // 錯誤!不能修改m_sName;  
  10.   
  11. for (int i = 0; i < s.size(); ++i)   
  12.     m_sName[i] = s[i];    // 不好的風格,但不是錯誤的  
  13. }  

 

        雖然m_Name不能被修改,但m_sName是char *類型,const成員函數可以修改其所指向的字符。

        const成員函數可以被具有相同參數列表的非const成員函數重載,例如,

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. class Screen {  
  2. public:  
  3. char get(int x,int y);  
  4. char get(int x,int y) const;  
  5. };  

 

        在這種情況下,類對象的常量性決定調用哪個函數。

 

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. const Screen cs;  
  2. Screen cc2;  
  3. char ch = cs.get(0, 0);  // 調用const成員函數  
  4. ch = cs2.get(0, 0);     // 調用非const成員函數  

小結:

1)const成員函數可以訪問非const對象的非const數據成員、const數據成員,也可以訪問const對象內的所有數據成員;

2)非const成員函數可以訪問非const對象的非const數據成員、const數據成員,但不可以訪問const對象的任意數據成員;

3)作為一種良好的編程風格,在聲明一個成員函數時,若該成員函數並不對數據成員進行修改操作,應盡可能將該成員函數聲明為const 成員函數。

 

參考資料:

《C++ Primer第三版》

《Effective C++第三版》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM