1. 程式人生 > >const提高函式健壯性

const提高函式健壯性

看到const關鍵字,首先想到是const常量,const更大的作用是它可以修飾函式的引數、返回值,甚至函式的定義體
1.用const修飾函式的引數
如果引數做輸出用,不論他是什麼資料型別,也不論它採用指標傳遞還是引用傳遞都不能加const修飾,否則該引數將失去輸出功能。
const只能修飾輸入引數:
a、如果輸入引數採用指標傳遞,那麼加const修飾可以防止意外的改動該指標,起到保護作用。
b、如果輸入的引數採用值傳遞,由於函式自動產生臨時變數用於複製該引數,輸入引數就無需保護,所以不需要加const。
c、對於非內部資料型別的引數而言,像void Fun(A a) 這樣的函式註定效率比較低,因為函式體將產生A型別的臨時物件用於複製該引數a,而臨時物件的構造,複製,析構過程都將消耗時間,為了提高效率,可以將函式宣告改為void Fun
(A &a) ,因為引用傳遞僅借用一下引數名而已,不需要產生臨時物件,但函式void Fun(A &a), 存在一個缺點,引用傳遞有可能改變引數a,所以加const即可。
d、以此類推, 是否應將void fun(int a)改寫成void fun(const int &a)來提高效率呢? 完全沒有必要,因為內部資料型別的引數不存在構造,析構過程,而複製也非常快,值傳遞和引用傳遞的效率幾乎一樣。

2.用const修飾函式的返回值
a、如果給以指標傳遞方式的函式返回值加const修飾,那麼函式返回值(指標)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指標。
eg:const char *GetString(void);
char *str = GetString(void) //錯誤
const char *str = GetString(void) //正確
b、如果函式返回採用值傳遞的方式,由於函式會把返回值複製到外部臨時的儲存單元中,加const沒有任何價值
eg:將int GetInt(void)改寫成const GetInt(void) //沒有任何價值
A GetA(void) 改成const A GetA(void) //沒有任何價值
如果返回值不是內部資料型別,將函式A GetA(void) 改成const A &GetA(void)的確能提高效率,但一定要搞清楚函式究竟是想返回一個物件的拷貝還是僅返回別名就可以了,否則程式會出錯。

3.const成員函式(const關鍵字只能放在函式宣告的尾部)
任何不會修飾資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其他非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。