const對象
如果你想定義一個永遠都不會改變的類對象,可以像下面這樣定義一個const對象
const CBox standard(10.0,10.0,10.0);
standard對象的成員變數的值將永不會改變。編譯器為了保證const對象不會改變,不允許調用const對象的非const成員函數。即使這個非const成員函數確實沒有改變任何成員變數的值。
const對象的原理是把對象的this指標都變成指向const對象的指標(指標指向的內容不允許改變)。而調用對象的成員函數時隱含有一個this指標參數。而指向const對象的指標是不能隱式轉換成指向非const對象的指標的。普通成員函數隱含的this指標參數為指向非const對象的指標。所以調用const對象的成員函數將導致編譯器嘗試將指向const對象的指標轉換為指向非const對象指標,這是不允許的。所以通不過編譯。
const成員函數
1.const成員函數承諾不會改變對象的成員變數值。所以在const成員函數內不允許有改變成員變數值的操作。也不允許調用對象的非const成員函數,只能調用const成員函數。
2.const成員函數的聲明和定義都必須使用const關鍵字(如果定義和實現是分開的),緊跟在函數參數列表後的反括弧之後。就像下面這樣:
class CBox{public:explicit CBox(double lv = 1.0,double bv = 1.0,double hv = 1.0){//...}double Volume() const;private:double m_Length;double m_Width;double m_Height;};double CBox::Volume() const{return m_Length*m_Height;}
及時傳回值、函數名和參數完全相同,有const修飾符和沒有const修飾符的函數是不同的。(const修飾符也是函數簽名的一部分?)。所以你可以定義同一個函數的const和非const版本。
建議:定義類時,最好把不會改變成類員變數的成員函數都定義為const函數。