2009-07-04 163 views
9

可能重複:
Difference between pointer variable and reference variable in C++C++ * VS和函數聲明

當我應該聲明我的變量作爲指針傳遞VS按引用的對象?它們在彙編中編譯爲相同的東西(至少在運行時漸近),所以何時應該使用哪個?當你想顯示值是可選的,因此可以爲0

從規則中排除使用*:

void foo(obj* param) 
void foo(obj& param) 
+2

Dupe of http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c其中很多很多人 – 2009-07-04 08:56:31

回答

12

我的規則很簡單所有_obj_s各地都存儲在容器中,你不」 t想要讓你的代碼看起來很難看,因爲使用的地方都是foo(*value);而不是foo(value); 那麼,爲了表明這個值不能爲0,把assert(value);放在函數begin處。

3

使用指針的一個原因是如果將NULL的值傳遞給該函數是有意義的。有了指針,預計能夠做到這一點。有參考資料,預計不能做到這一點。

(然而,這樣棘手的事情,仍然可以爲NULL傳遞到一個基準參數,你可以想到的是,所謂的功能可能在這種情況下崩潰。)

另一個約定是,如果你傳遞一個指向函數的指針,函數可以使用指針來獲取對象的所有權(特別是在類似COM的引用計數環境中)。如果你傳遞一個引用,那麼被調用的函數可以期望在函數調用期間使用該對象,但不保留指向該對象的指針以備後用。

6

我遵循Google style guide standard,因爲它對我最有意義。它指出:

在功能參數列出所有 引用必須是const:

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

其實,這是一個非常強大的慣例 在谷歌代碼,輸入參數 爲值或常數引用, 輸出參數是指針。輸入 參數可能是const指針,但是 我們絕不允許非const引用 參數。當您可能需要輸入 參數是一個常量指針

一種情況是,如果 要強調的是, 說法是不可複製的,所以它必須 存在的對象的生命週期; 通常最好在 註釋中記錄這一點。 STL適配器如 bind2nd和mem_fun不允許 參考參數,因此您必須在這些情況下使用指針 聲明參數 。

+1

我不同意這一點。這是對語言中引用/指針概念的濫用。引用是它們在編譯時確保一個值被初始化。這是一個非常強大的合約,其中一個聲明該函數只接受初始化值。像Java或C#這樣的語言缺乏,這迫使開發人員加入,以檢查傳遞的值是否爲NULL(空)。我沒有看到合同中的強制執行,我只能接受常數值。 – ovanes 2009-07-04 11:48:29

1

指針和引用之間的另一個區別是,它暗示着你不會堅持引用,除非你傳遞給構造函數。傳遞指針可能意味着對象可能持有一段時間,就像一個複合模式對象。

0

爲什麼我在C++應用程序中使用指針而不是引用的一個很好的理由是可讀性。當使用指針時,您會看到實際發生的情況,使用指針時語法會告訴您實際發生了什麼。

同樣適用於「0」或「NULL」。我更喜歡使用「NULL」,這樣3個月後,當我看到像代碼:

somevar_1 = 0; 
somevar_2 = NULL; 

我知道somevar_1int(或float)和somevar_2是某種指針。