2011-09-29 70 views
7

是否有任何合理用例,其中一個應該使用const指針參考?參考(T&)和常量指針(T * const)之間的選擇

T obj; 
T &r = obj; // style-1 
T* const p = &obj; // style-2 

這兩種風格都可以用於相同的目的。我一直比較喜歡代碼中的第一種風格,並認爲後面的風格爲已棄用。但是我仍然懷疑是否錯過了第二種風格更好的用例?

編輯:不限制上面的例子,我跟在更廣泛的意義上說,

void foo (T& r); // style-1 
void foo (T* const p); // style-2 

[I從少數,風格-2可以通過空的答案見。]

+0

爲了什麼目的?我知道這個代碼是你所問的語法的說明,但是你在想什麼樣的真實代碼場景? –

+0

對於函數,by-copy參數的常量是不相關的實現細節。 –

回答

5

一個const指針(T* const)可以NULL,這可能是有用的時候將參數傳遞給函數或從函數返回值時。例如,如果您有搜索功能,如果它沒有找到任何內容,您可能希望它返回NULL。如果返回引用類型,則不能這樣做。

1

對於函數參數,我更喜歡指向引用的指針,因爲我可以告訴調用站點該參數是一個out參數。如果函數參數是一個const引用,那麼我更喜歡引用。

的另一大區別是r不能爲空,所以如果你需要它,那麼你需要的風格-2

+0

沒關係;移動界面似乎不支持刪除評論。 –

2

讓我出門在這裏。既然你明確地說「常量指針」,我假設你是而不是談論函數參數或函數返回值。對於通過複製傳遞函數參數,常量性是不相關的實現細節:

void foo(T *);   // declaration 

void foo(T * const pt) // implementation, 
{ /* ... */ }   // pt is const inside the body (who cares?) 

因此,我想到的唯一的使用情況是,如果你需要做一個別名地方你自己的代碼中。在那種情況下,我總是喜歡參考。比較:

for (auto it = box.begin(); it != box.end(); ++it) 
{ 
    T & trinket = *it;  // nice 
    T * const ptr = &*it; // wtpf? 

    // ... 
} 

既然你編輯你的問題:有明顯的功能參數的差異。

void foo(T &); 
void bar(T *); 

foo你保證有一個可行的,可變的對象引用;在bar中,您必須檢查指針是否爲空(給出可選參數的概念)。從這個意義上說,T&T*並沒有真正的可比性。

+0

可能是你誤解了。 'T&'(而不是'const T&')和'T * const'(而不是'T *')是非常可比的。它們幾乎是相同的,除了簽名和指針可以傳遞爲空的事實(正如在幾個答案中所暗示的)。 – iammilind

+0

我知道。但'T&'和'T *'不是。對於函數調用,不存在'T * const'這樣的事情。 –

0

1)當使用引用時,對象必須存儲在變量中。例如,你可以這樣做:

void funct (T &); 
funct (T ("Calling constructor")); 

必須做到:

void funct (T &); 
T obj ("Calling constructor"); 
funct (obj); 

2)使用時參考,無法測試它的值(例如。檢查它是否是通常使用的NULL)

其他都是一樣的。

我通常只在使用true變量作爲參數調用函數很重要時才使用它們。我可能會老掉牙,但在任何其他情況下,指針的方式對我來說都更好。

+0

在你的情況(1)它是一個臨時變量,實際上它是一件好事,我們無法將它存儲在引用中。 – iammilind