【问题标题】:Reference and pointer function parameter引用和指针函数参数
【发布时间】:2011-06-17 06:14:53
【问题描述】:

在我的代码中我有这个:

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

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

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

我不喜欢我将一个指针传递给 f3,然后将它的值作为引用传递,然后将地址作为指针传递。

如果f2也带指针更好?

【问题讨论】:

  • 或者其他人最好参考一下。虽然更糟糕的是delete 声明,但它应该被包装起来。
  • 不能全部通过引用吗?
  • f2 有一个约定,它永远不应该采用 NULL,所以在那里引用就可以了。它可能会修改对象,因此它需要非常量。 f1 允许您传递 NULL 并处理这种情况。
  • 在示例中f3f1 应该使用指针,因为前者拥有x 的所有权,而后者接受NULL

标签: c++ function pointers reference arguments


【解决方案1】:

为班级的界面使用简单的设计。特别是,更喜欢对指针的引用。

只有在别无选择时才使用指针作为参数。在这些情况下,准确记录谁拥有指针(通常是调用者 - 因此,通常,您不应该删除传递给您的指针)。

【讨论】:

  • @GMan 是的。我想强调“避免在类接口中使用指针”。
【解决方案2】:

通常的规则是,如果您可以参考,那么您就可以参考。但是,在您的示例中使用 f3 的情况,它删除指针的事实表明,如果您的函数采用指针,它会简单得多,因为没有人会期望函数删除引用。

f2 强制用户传入非 NULL,因此引用是个好主意。推测为 const-correct 而没有任何进一步的信息,即 f2 可以通过调用非 const 方法来修改 Obj。

f1、f2、f3这样的名字很难看出设计好不好。有时,名字可以使一切变得不同。例如,如果 f3 的名称是“useAndDispose”或类似名称,那么函数的调用者很清楚指针将在使用后被删除。

类似地,如果您的函数返回用户必须清理的资源,则通常最好使用表明这一点的名称(createSomething 而不是 getSomething)。

丹尼尔说“通常”你不会删除传递给你的指针。不是“从不”。该函数可能具体来说是一个清理函数,或者它可能是一个工作流情况,其中一些东西被传递然后处理掉。

我想说的是,你永远不应该删除传递给你的引用(当然,首先要获取它们的地址),因为没有人会期望它会这样做。

【讨论】:

  • +1,很高兴强调函数名称和语义。 (呃,很遗憾我今天已经达到每日投票上限,明天会+1 ;-)
【解决方案3】:

指针和引用的主要区别在于引用不能为NULL。所以,如果f2()的参数是强制的,那么你应该通过引用传递。

查看this other questions

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2010-10-11
    • 2012-03-22
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多