Google C++ Coding Style:引用參數

來源:互聯網
上載者:User

標籤:編碼規範

Google C++ Coding Style定義

輸入參數以值或者const引用形式傳入,輸出參數使用指標。 所有以引用形式輸入參數必須加上const,即const T&的形式。

即如下形式:

void Foo(const string &in, string *out);

在如下情況下, 可以使用const T*的形式:
* 需要進行指標的判空 (即null 指標是合理的)。
* 需要使用到輸入參數的指標或引用形式。

為什麼要使用const T&形式?

以值傳入是最為安全的形式,因為它總是提供一個複本到函數中。對於複雜的參數(結構或類),這也引入了不必要的拷貝的開銷。使用指標及引用都可以解決這個問題。而引用則更為安全,可以避免一些不必要的null 指標判斷。所以輸入參數以const T&的形式的定義, 與傳遞值的語義相似,既避免了拷貝,又避免了意外修改。

下面這個例子,則表現出函數即使定義為const T&形式,仍然可能出現null 指標引入的問題:

 void test(const A& a) {     a.max = 10; } A* b = NULL; test(*b);

這是一個錯誤使用引用的示範,文法上合法,但這樣的實現是不允許的。判空的責任在於調用者,而不在函數。(參考:How do you check for NULL when passing by reference in C++?)

另外,因為傳引用,在其本質也是以指標形式提供的,所以在效能相對於傳值會低一些的。所以簡單的資料類型還是要傳值。

輸出參數為什麼是指標呢

以引用和指標的形式,都可以作為函數的輸出參數。如果沒有const修飾引用,則引用形式的參數就可以成為一個輸出參數。這可能會讓代碼的讀者對參數的類型產生錯覺。正是Google C++ Coding Style中所描的: 引用有著和值類的文法,但卻是指標的語義。代碼的讀者會對能不能改變一個參數的值產生疑問, 以為傳入的是Value, 但值卻改變了。雖然看一下函式宣告就可以了,但如果一個大型項目,還是要追求做到一目瞭然。

總結

作為編碼規範定義出來的,主要是為了統一大家的編碼習慣,減少一些”驚喜”。單純從傳值,傳引用,亦或傳指標的形式,cplusplus.com上的一篇也可以作為參考When to pass parameters by value, reference, and pointer。總結一下參數三種傳入形式的核心點:
1. 傳值效能最高,但有拷貝的開銷。
2. 傳引用時空值是不合法的,不用判空,沒有拷貝的開銷。
3. 傳指標時空值是合法的,需要判空,也沒有拷貝的開銷。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Google C++ Coding Style:引用參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.