我有這樣的:參考和指針的函數參數
void f1(Obj*x){
if(x==0){return;}
...
}
void f2(Obj&x){
...
f1(&x);
...
}
void f3(Obj*x){
...
f2(*x);
...
delete x;
}
我不喜歡,我傳遞一個指針到F3,然後把它的值把它作爲參考,然後把地址通過它作爲指針。
如果f2也帶指針會更好嗎?
我有這樣的:參考和指針的函數參數
void f1(Obj*x){
if(x==0){return;}
...
}
void f2(Obj&x){
...
f1(&x);
...
}
void f3(Obj*x){
...
f2(*x);
...
delete x;
}
我不喜歡,我傳遞一個指針到F3,然後把它的值把它作爲參考,然後把地址通過它作爲指針。
如果f2也帶指針會更好嗎?
使用一個簡單的設計爲您的班級的接口。特別是,更喜歡指針的引用。
僅當沒有其他選擇時才使用指針作爲參數。在這些情況下,準確記錄誰擁有指針(通常,調用者 - 因此,通常爲,您不應該刪除傳遞給您的指針)。
正常的規則是,如果你可以參考然後你做。以你的例子中的f3爲例,它刪除指針的事實表明,如果你的函數需要一個指針,它會簡單得多,因爲沒有人會希望函數刪除一個引用。
f2強制用戶傳遞非NULL,所以引用是個好主意。假定不需要任何進一步的信息就可以進行常量糾正,即f2可以通過調用Obj上的非const方法來修改Obj。
很難看出這個設計是否是一個很好的名稱,如f1,f2和f3。有時名字可以使所有的差異。例如,如果f3的名稱是「useAndDispose」或類似的名稱,則該函數的調用者清楚該指針在使用後將被刪除。
同樣,如果你的函數返回一個用戶必須清理的資源,通常最好使用一個表示這個(createSomething而不是getSomething)的名稱。
丹尼爾說「通常」你不會刪除傳遞給你的指針。但不是「從不」。該功能可能特別是一個清理功能,或者它可能是一種工作流程的情況,通過某種方式傳遞並處理。
我會說,儘管你不應該刪除傳遞給你的引用(當然首先考慮他們的地址),因爲沒有人看你的代碼會期望它做到這一點。
指針和引用之間的主要區別是引用不能爲NULL。所以,如果參數f2()
是強制性的,那麼你應該通過引用。
或者,對其他人來說參考更好。儘管`delete`語句更糟糕,它應該被包裝起來。 – GManNickG 2011-01-28 13:46:09
你不能通過參考? – 2011-01-28 13:47:54
f2有一個契約,它不應該採取NULL,所以在那裏引用是好的。它可能會修改該對象,以便它使用非const。 f1允許你傳遞一個NULL並處理這個事件。 – CashCow 2011-01-28 13:58:29