標籤:amp char bsp swap 入參 保護 div 自訂 class
被const 修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。所以很多C++程式設計書籍建議:“Use const whenever you need”。 1、成員函數中const的使用 一般放在函數體後,形如:void fun() const;
如果一個成員函數的不會修改資料成員,那麼最好將其聲明為const,因為const成員函數中不允許對資料成員進行修改,如果修改,編譯器將報錯,這大 大提高了程式的健壯性。 2、修飾函數的參數
如果參數作輸出用,不論它是什麼資料類型,也不論它採用下文討論的“指標傳遞”還是“引用傳遞”,都不能加const 修飾,否則該參數將失去輸出功能。const 只能修飾輸入參數,這又分為以下幾種情況。
2.1 const 用於修飾“指標傳遞”的參數,以防意外改動指標所指資料
例如某個 StringCopy 函數:
void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是輸入參數,strDestination 是輸出參數。給 strSource 加上 const 修飾後,如果函數體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。
2.2 const 用於修飾“指標傳遞”的參數,以防意外改動指標本身
考慮如下代碼:
void swap ( int * const p1 , int * const p2 )
該定義將限制在函數 swap 內修改指標 p1 和 p2 的指向。
3、void Func (MyClass &a)
如果輸入參數採用“值傳遞”,由於函數將自動產生臨時變數用於複製該參數,該輸入參數本來就無需保護,所以不要加const 修飾。
例如不要將函數 void Func1 (int x) 寫成 void Func1(const int x)。同理不要將函數 void Func2(MyClass a) 寫成void Func2(const MyClass a)。其中 MyClass 為使用者自訂的資料類型。
然而,對於非內部資料類型的參數而言,類似 void Func(MyClass a) 這樣聲明的函數效率會比較底,這是因為函數體內將產生MyClass類型的臨時對象用於複製參數a,而臨時對象的構造、複製、析構過程都將消耗時間。為了提高效率,可以將函式宣告改為void Func (MyClass &a),因為“引用傳遞”僅借用一下參數的別名而已,不需要產生臨時對象。
但是函數void Func(MyClass & a) 存在一個缺點:“引用傳遞”有可能改變參數a,這是我們不期望的。
解決這個問題很容易,加const修飾即可,因此函數最終成為void Func(const MyClass &a)。
C++之const