在我的代码中我有这个:
void f1(Obj*x){
if(x==0){return;}
...
}
void f2(Obj&x){
...
f1(&x);
...
}
void f3(Obj*x){
...
f2(*x);
...
delete x;
}
我不喜欢我将指针传递给f3,然后将其值作为参考传递给它,然后将地址作为指针传递给它。
如果f2也采用指针会更好吗?
答案 0 :(得分:0)
为您的班级界面使用简单的设计。特别是,更喜欢对指针的引用。
仅在没有替代选项时才使用指针作为参数。在这些情况下,准确记录谁拥有指针(通常是调用者 - 因此,通常是,你不应该删除传递给你的指针)。
答案 1 :(得分:0)
通常的规则是,如果您可以参考,那么您可以。在你的例子中使用f3的情况,它删除指针的事实表明,如果你的函数接受一个指针,它会更简单,因为没有人会期望一个函数来删除一个引用。
f2强制用户传入非NULL,因此引用是个好主意。假定const-correct没有任何进一步的信息,即f2可以通过调用Obj来修改Obj。
很难看出设计是否是一个名称如f1,f2和f3的好设计。有时这些名字可以产生重大影响。例如,如果f3的名称是“useAndDispose”或类似名称,则函数的调用者可以清楚地看到指针在使用后将被删除。
同样,如果你的函数返回了一个用户必须清理的资源,通常最好用一个名称来表示这个(createSomething而不是getSomething)。
Daniel说“通常”你不会删除传递给你的指针。但不是“从不”。该功能可能具体是一个清理功能,也可能是一种工作流情况,即某些东西被传递然后被处理掉。
我会说,你永远不应该删除传递给你的引用(当然首先是他们的地址),因为没有人会看到你的代码会期望它这样做。
答案 2 :(得分:0)
指针和引用之间的主要区别在于引用不能为NULL。因此,如果f2()
的参数是必需的,那么您应该通过引用传递。