2011-01-28 120 views
0

我有這樣的:參考和指針的函數參數

void f1(Obj*x){ 
if(x==0){return;} 
... 
} 

void f2(Obj&x){ 
... 
f1(&x); 
... 
} 

void f3(Obj*x){ 
... 
f2(*x); 
... 
delete x; 
} 

我不喜歡,我傳遞一個指針到F3,然後把它的值把它作爲參考,然後把地址通過它作爲指針。

如果f2也帶指針會更好嗎?

+2

或者,對其他人來說參考更好。儘管`delete`語句更糟糕,它應該被包裝起來。 – GManNickG 2011-01-28 13:46:09

+0

你不能通過參考? – 2011-01-28 13:47:54

+0

f2有一個契約,它不應該採取NULL,所以在那裏引用是好的。它可能會修改該對象,以便它使用非const。 f1允許你傳遞一個NULL並處理這個事件。 – CashCow 2011-01-28 13:58:29

回答

0

使用一個簡單的設計爲您的班級的接口。特別是,更喜歡指針的引用。

僅當沒有其他選擇時才使用指針作爲參數。在這些情況下,準確記錄誰擁有指針(通常,調用者 - 因此,通常爲,您不應該刪除傳遞給您的指針)。

0

正常的規則是,如果你可以參考然後你做。以你的例子中的f3爲例,它刪除指針的事實表明,如果你的函數需要一個指針,它會簡單得多,因爲沒有人會希望函數刪除一個引用。

f2強制用戶傳遞非NULL,所以引用是個好主意。假定不需要任何進一步的信息就可以進行常量糾正,即f2可以通過調用Obj上的非const方法來修改Obj。

很難看出這個設計是否是一個很好的名稱,如f1,f2和f3。有時名字可以使所有的差異。例如,如果f3的名稱是「useAndDispose」或類似的名稱,則該函數的調用者清楚該指針在使用後將被刪除。

同樣,如果你的函數返回一個用戶必須清理的資源,通常最好使用一個表示這個(createSomething而不是getSomething)的名稱。

丹尼爾說「通常」你不會刪除傳遞給你的指針。但不是「從不」。該功能可能特別是一個清理功能,或者它可能是一種工作流程的情況,通過某種方式傳遞並處理。

我會說,儘管你不應該刪除傳遞給你的引用(當然首先考慮他們的地址),因爲沒有人看你的代碼會期望它做到這一點。

0

指針和引用之間的主要區別是引用不能爲NULL。所以,如果參數f2()是強制性的,那麼你應該通過引用。

結賬this other questions