編碼階段,很多人不太注意const的使用,認為可有可無,如果你開發的是一個簡單的系統,如果你一個人就能記住所有變量的意義,如果你一個人就能控制所有變量的使用位置,如果你的軟件發布後不需要更多的維護工作,那麼你可以忘記const,否則,const就是一個多個程序員之間溝通的強大工具。
首先,const的最基本用法就是標識常量,使編譯器能夠檢測出對該變量的不正確使用,也可以使其他的程序員使用此常量時,注意不能改變此常量。const出現在不同的位置有不同的意義。
√ const int number = 1; // 該變量為常量,以後不能再對它賦值,所以這裡必須賦初值
√ const int * pNumber; // 指向常量的指針,(*pNumber)的值不能改變,但指針pNumber的值可以改變
√ int * const pNumber = & number2; // 指向變量的常量指針,指針的值不能改變,所以必須先初始化
√ const int * const pNumber = & number; // 指向常量的常量指針,常量和指針的值都不能改變,所以必須先初始化
√ const int & number1 = number; // 指向常量的引用,C++中所有的引用都是常量引用,一個引用指向一個變量後,不能再改變值指向另一個變量,所以不論是否說明,引用都是常量引用,必須在初始化時賦初值
其次,C++對函數的參數不區分輸入參數和輸出參數,而且經常由於一個返回值不夠用,我們會傳遞幾個引用或指針來接收返回值。我們可以用const來標明某參數為輸入參數,函數內不會改變此參數的值,如下面一個函數:
bool CopyClass(Value & dest, const Value & src);
其中,Value為用戶定義的類,CopyClass函數的功能為拷貝src的內容到dest,src為輸入參數,其值不能被改變,dest為輸出參數,其他程序員根據函數的定義,就能對函數的功能有個清晰的了解。
下面,讓我們來看一下const的最後一種用法。請看下面CopyClass函數和Value類的實現:
class Value {
public:
int GetValue() { return _value; }
private:
int _value;
}
bool CopyClass(Value & dest, const Value & src) {
int v = src.GetValue();
…………
}
請問:這段代碼能編譯通過嗎?測試一下,果然出現了編譯錯誤,錯誤出現在下面語句:
int v = src.GetValue(); // 編譯錯誤,由於src為指向常量的引用,編譯器無法確定GetValue函數是否改變了src的內容,所以禁止調用
那麼,我們只能放棄使用const標識輸入參數了嗎?不,我們另有辦法,只要把GetValue函數的定義作如下改變即可:
int GetValue() const { return _value; } // const表示對傳遞給它的this指針指向的內容(即Value類)不做任何改變
經過這樣的改變,上述代碼就能編譯通過了,其他的程序員也可以很快的了解到,該成員函數只是輸出類對象的內容,不會改變類對象的任何內容。