2011-01-28 155 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