轉自:http://blog.csdn.net/lihao21/article/details/8634876編程
咱們知道,在C++中,若一個變量聲明爲const類型,則試圖修改該變量的值的操做都被視編譯錯誤。例如,安全
面向對象程序設計中,爲了體現封裝性,一般不容許直接修改類對象的數據成員。若要修改類對象,應調用公有成員函數來完成。爲了保證const對象的常量性,編譯器須區分不安全與安全的成員函數(即區分試圖修改類對象與不修改類對象的函數)。例如,ide
在C++中,只有被聲明爲const的成員函數才能被一個const類對象調用。函數
要聲明一個const類型的類成員函數,只須要在成員函數參數列表後加上關鍵字const,例如,url
在類體以外定義const成員函數時,還必須加上const關鍵字,例如spa
若將成員成員函數聲明爲const,則該函數不容許修改類的數據成員。例如,.net
在上面成員函數的定義中,ok()的定義是合法的,error()的定義則非法。設計
值得注意的是,把一個成員函數聲明爲const能夠保證這個成員函數不修改數據成員,可是,若是據成員是指針,則const成員函數並不能保證不修改指針指向的對象,編譯器不會把這種修改檢測爲錯誤。例如,指針
雖然m_Name不能被修改,但m_sName是char *類型,const成員函數能夠修改其所指向的字符。code
const成員函數能夠被具備相同參數列表的非const成員函數重載,例如,
在這種狀況下,類對象的常量性決定調用哪一個函數。
小結:
1)const成員函數能夠訪問非const對象的非const數據成員、const數據成員,也能夠訪問const對象內的全部數據成員;
2)非const成員函數能夠訪問非const對象的非const數據成員、const數據成員,但不能夠訪問const對象的任意數據成員;
3)做爲一種良好的編程風格,在聲明一個成員函數時,若該成員函數並不對數據成員進行修改操做,應儘量將該成員函數聲明爲const 成員函數。
參考資料:
《C++ Primer第三版》
《Effective C++第三版》