若是不但願某個對象的值被改變,則定義該對象的時候能夠在前面加const
關鍵字函數
class CTest { public: void SetValue() {} private: int m_value; }; const CTest obj; // 常量對象
在類的成員函數後面能夠加const
關鍵字,則該成員函數成爲常量成員函數。指針
class Sample { public: void GetValue() const {} // 常量成員函數 void func(){} int m_value; }; void Sample::GetValue() const // 常量成員函數 { value = 0; // 出錯 func(); // 出錯 } int main() { const Sample obj; obj.value = 100; // 出錯,常量對象不能夠被修改 obj.func(); // 出錯,常量對象上面不能執行 非 常量成員函數 obj.GetValue // OK,常量對象上能夠執行常量成員函數 return 0; }
兩個成員函數,名字和參數表都同樣,可是一個是const,一個不是,那麼是算是重載。code
class Sample { public: Sample() { m_value = 1; } int GetValue() const { return m_value; } // 常量成員函數 int GetValue() { return 2*m_value; } // 普通成員函數 int m_value; }; int main() { const Sample obj1; std::cout << "常量成員函數 " << obj1.GetValue() << std::endl; Sample obj2; std::cout << "普通成員函數 " << obj2.GetValue() << std::endl; }
執行結果:對象
常量成員函數 1 普通成員函數 2
引用前面能夠加const關鍵字,成爲常引用。不能經過常引用,修改其引用的變量的。class
const int & r = n; r = 5; // error n = 4; // ok!
對象做爲函數的參數時,生產該對象參數是須要調用複製構造函數的,這樣效率就比較低。用指針做爲參數,代碼又很差看,如何解決呢?效率
能夠用對象的引用做爲參數,防止引起復制構造函數,如:變量
class Sample { ... }; void Func(Sample & o) // 對象的引用做爲參數 { ... }
可是有個問題,對象引用做爲函數的參數有必定的風險性,若函數中不當心修改了形參0,則實參也會跟着變,這可能不是咱們想要的,如何避免呢?構造函數
能夠用對象的常引用做爲參數,如:引用
class Sample { ... }; void Func(const Sample & o) // 對象的常引用做爲參數 { ... }
這樣函數中就能確保不會出現無心中更改o值的語句了。error