Google C++ Coding Style:引用引數
Google C++ Coding Style定義
輸入引數以值或者const引用形式傳入,輸出引數使用指標。 所有以引用形式輸入引數必須加上const,即const T&的形式。
即如下形式:
void Foo(const string &in, string *out);
在如下情況下, 可以使用const T*的形式:
* 需要進行指標的判空 (即空指標是合理的)。
* 需要使用到輸入引數的指標或引用形式。
為什麼要使用const T&形式?
以值傳入是最為安全的形式,因為它總是提供一個複本到函式中。對於複雜的引數(結構或類),這也引入了不必要的拷貝的開銷。使用指標及引用都可以解決這個問題。而引用則更為安全,可以避免一些不必要的空指標判斷。所以輸入引數以const T&的形式的定義, 與傳遞值的語義相似,既避免了拷貝,又避免了意外修改。
下面這個例子,則表現出函式即使定義為const T&形式,仍然可能出現空指標引入的問題:
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:右值引用(Rvalue Reference)GoC++
- Google C++ style guide——格式GoC++GUIIDE
- Google C++ Style Guide的哲學GoC++GUIIDE
- c# 方法引數_引用引數C#
- 【c++】引用計數C++
- c++中物件的引用作為函式的引數C++物件函式
- vim Google style formatGoORM
- 關於C++引用做為函式引數和指標作為函式引數C++函式指標
- Google 是如何審批20億行程式碼的?coding style 真的很重要!Go行程
- C#中的值引數,引用引數及輸出引數C#
- C++ 預設引數與引用傳遞:語法、用法及示例C++
- C++ coding standardC++
- Google C++單元測試框架(Gtest)系列教程之四——引數化GoC++框架
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- C++ :引用計數(reference count) 實現C++
- C++ 引用 (交換兩個數的值)C++
- C++預設引數C++
- 【C++】引用C++
- c++引用C++
- C++ 引用C++
- php函式引用傳遞引數的方法PHP函式
- C++型別引數化C++型別
- c++可變模板引數C++
- C++ lambda 引用捕獲臨時物件引發 coredump 的案例C++物件
- C++逆向 可變引數HookC++Hook
- C++引數的傳遞方式C++
- 【C++】引數的預設值C++
- C++左值引用與右值引用C++
- c++ 左值引用與右值引用C++
- C++ 右值引用和左值引用C++
- C++智慧指標學習——小談引用計數C++指標
- 詳解C++引用C++
- c++筆記_引用C++筆記
- C++右值引用C++
- 由作業題引發對C++引用的一些思考C++
- Google:2012年Google搜尋熱榜: 江南Style入圍Go
- Python的函式引數傳遞:傳值?引用?Python函式
- C#程式設計:ref【引數按引用傳遞】C#程式設計