C++之const

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.