前端時間剛開始學mfc ,老師沒講語法,對c++中const不是很了解,找了一篇文章看了一下。
看到const關鍵字,c++程式設計師首先想到的可能是const常量。
const更大的魅力是它可以修飾函式的引數、返回值,甚至函式的定義體。
const是constant的縮寫,「恆定不變」的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。
1、用const修飾函式的引數
如果引數作輸出用,不論它是什麼資料型別,也不論它採用「指標傳遞」還是「引用傳遞」,都不能加const修飾,否則該引數將失去輸出功能。
const只能修飾輸入引數,
如果輸入引數採用「指標傳遞」,那麼加const修飾可以防止意外地改動該指標,起到保護作用。
例如:stringcopy函式
void stringcopy(char *strdestination, const char *strsource);
其中strsource是輸入引數,strdestination是輸出引數。給strsource加上const修飾後,如果函式體內的語句試圖改動strsource的內容,編譯器將指出錯誤。
如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const修飾。
例如:不要將函式void func1(int x) 寫成void func1(const int x)。同理不要將函式void func2(a a) 寫成void func2(const a a)。其中a為使用者自定義的資料型別。
對於非內部資料型別的引數而言,像void func(a a) 這樣宣告的函式注定效率比較低。因為函式體內將產生a型別的臨時物件用於複製引數a,而臨時物件的構造、複製、析構過程都將消耗時間。
為了提高效率,可以將函式宣告改為void func(a &a),因為「引用傳遞」僅借用一下引數的別名而已,不需要產生臨時物件。但是函式void func(a &a) 存在乙個缺點:「引用傳遞」有可能改變引數a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函式最終成為void func(const a &a)。
以此類推,是否應將void func(int x) 改寫為void func(const int &x),以便提高效率?完全沒有必要,因為內部資料型別的引數不存在構造、析構的過程,而複製也非常快。
2、 用const修飾函式的返回值
如果給以「指標傳遞」方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const修飾的同型別指標。
例如:函式
const char * getstring(void);
當使用如下語句將出現編譯錯誤:
char *str = getstring();
正確的用法是
const char *str = getstring();
3、const成員函式
任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。
以下程式中,類stack的成員函式getcount僅用於計數,從邏輯上講getcount應當為const函式。編譯器將指出getcount函式中的錯誤。
class stack ;
int stack::getcount(void) const
const成員函式的宣告看起來怪怪的:const關鍵字只能放在函式宣告的尾部,大概是因為其它地方都已經被占用了。
使用const 提高函式的健壯性
1,用const修飾函式的引數 1.1如果此引數是作輸出用,則不論它是什麼資料型別,也不論它採用 指標傳遞 或 引用傳遞 都不能加const修飾,否則該將失去輸出功能。如果此引數是作輸入用,則用const 修飾可以防止意外地改動該指標,採用規則 常量指標,或指標常量而定 如果直接採用值傳遞的話 則不...
使用const提高函式的健壯性
const不僅是用來定義const常量 更大的作用是修飾函式的引數 返回值 函式的定義體 const是constant的縮寫,恆定不變的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,提高程式的健壯性。so use const whenever you need.用const修飾函式...
如何提高jms程式的健壯性
jms api 提供了一下的方式來建立乙個健壯的 jms 應用程式 控制訊息的確認方式 acknowledgment 配置訊息的永續性 確保當 jms 提供者失敗時,訊息不會丟失 設定訊息的優先順序 影響訊息傳遞的順序 允許訊息過期 設定訊息的過期時間,這樣訊息過期後 jms provider 就會...