将可修改的参数传递给c ++函数

时间:2009-08-24 13:44:23

标签: c++ pointers parameters reference

提供,我想将一个可修改的参数传递给一个函数,我应该选择什么:通过指针传递它还是通过引用传递它?

  1. bool GetFoo(Foo& whereToPlaceResult);
  2. bool GetFoo(Foo * whereToPlaceResult);
  3. 我问这是因为我一直认为这是通过引用(1)传递参数的最佳实践,但在检查了一些本地代码数据库后,我得出结论,最常见的方法是(2)。此外,该男子本人(Bjarne Stroustrup)建议使用(2)。 (1)和(2)的[dis]优点是什么,或者只是个人品味的问题?

12 个答案:

答案 0 :(得分:22)

我更喜欢参考而不是指针:

  • 不能为空
  • 无法更改(指向其他内容)
  • 不得删除(通过接收指针的人)

有些人说虽然引用和const引用之间的区别对于很多人来说太微妙了,并且在调用该方法的代码中是不可见的(即,如果你读取通过引用传递参数的调用代码,你无法看到它是一个const还是一个非const引用),因此你应该把它作为一个指针(在调用代码中使它明确表示你给出了变量的地址,因此你的变量的值可能会被被调用者改变。

我个人更喜欢参考,原因如下:

  1. 我认为例程应该知道它调用的子程序
  2. 子程序不应该假设它被调用的例程。
  3. [1.]意味着使调用者可见性变得无关紧要,因为调用者应该(通过其他方式)理解子例程的作用(包括它将修改参数的事实)。 / p>

    [2.]意味着如果它是一个指针,那么子程序应该处理参数为空指针的可能性,这可能是额外的和IMO无用的代码。

    此外,每当我看到一个指针,我想,“谁会删除它,何时?”,所以无论何时/何地所有权/生命/删除都不是问题,我更喜欢使用引用。

    为了它的价值,我养成了编写const-correct代码的习惯:所以如果我声明一个方法有一个非const引用参数,那么它是非const的事实是重要的。如果人们没有编写const-correct代码,那么可能更难判断一个参数是否会在子例程中被修改,而另一个机制的参数(例如指针而不是引用)会更强一些。 / p>

答案 1 :(得分:5)

通过引用传递的优点:

  • 强制用户提供值。
  • 不易出错:处理指针取消引用本身。不必在里面检查null。
  • 使调用代码看起来更清晰。

按值传递指针的优点:

  • 允许为“可选”参数传递null。有点难看的黑客,但有时很有用。
  • 强制来电者知道参与的内容。
  • 为读者提供了关于参数可能做什么的一半线索,而无需阅读API。

由于引用传递是在语言中,因此任何非指针参数也可能会被修改,并且您知道指针值正在被更改。我见过API,它们被视为常量。因此,指针传递并不能真正为读者提供他们可以信赖的任何信息。对于一些可能足够好的人,但对我来说却不是。

实际上,指针传递只是一个容易出错的凌乱黑客来自C,没有其他方法通过引用传递值。 C ++有一种方法,所以不再需要hack。

答案 2 :(得分:4)

通过引用传递的一个优点是它们不能为空(与指针不同),从而无需对每个out参数进行空值检查。

答案 3 :(得分:3)

我建议您 考虑 (可能不是最适合所有情况)从函数返回Foo而不是修改参数。你的函数原型看起来像这样:

Foo GetFoo() // const (if a member function)

当您似乎返回成功/失败标志时,使用异常可能是更好的策略。

优点:

  • 您可以避免所有指针/引用问题
  • 简化来电者的生活。例如,可以在不使用局部变量的情况下将返回值传递给其他函数。
  • 如果抛出异常,调用方无法忽略错误状态。
  • 返回值优化意味着它可能与修改参数一样有效。

答案 4 :(得分:1)

我选择#2,因为在调用点很明显,参数将被更改。

GetFoo(& var)而不是GetFoo(var)

我更喜欢通过引用传递const引用,我试图避免复制构造函数调用。

答案 5 :(得分:1)

通过引用传递,并避免整个NULL指针问题。

答案 6 :(得分:0)

我似乎记得在c ++引用中,不是null和指针。现在我已经很长时间没有完成c ++了,所以我的记忆可能会生锈。

答案 7 :(得分:0)

这里的差异相对较小。

引用不能为NULL。

可以传递nullpointer。 因此,您可以检查是否会发生这种情况并作出相应的反应。

我个人无法想到两种可能性之一的真正优势。

答案 8 :(得分:0)

我认为这是个人品味的问题。我实际上更喜欢通过引用传递,因为指针提供了更多的自由,但它们也往往会导致很多问题。

答案 9 :(得分:0)

指针的好处是你可以传递任何东西,即。使用它,好像参数是完全可选的,并且没有调用者传入的变量。

否则参考文献会更安全,如果你有一个保证存在且可写的(除非当然是const)

我认为这是一个偏好的问题,但我不喜欢将两者混合在一起,因为我认为它使代码的维护和可读性更难做(特别是当你的2个函数对调用者看起来相同时)

答案 10 :(得分:0)

这些天我使用const引用作为输入参数和指针输出参数。 FWIIW,Google C++ Style Guide recommends the same approach(不是我总是同意他们的风格指南 - 例如他们不使用例外,这通常没有多大意义)

答案 11 :(得分:0)

我的偏好是参考。首先,因为它押韵。 :)也是因为其他答案指出的问题:不需要取消引用,也没有引用为NULL的可能性。我没有看到的另一个原因是,当你看到一个指针时,你无法确定它是否指向动态分配的内存,你可能想要在它上面调用delete。另一方面,参考文献没有任何关于内存管理的模糊性。

话虽如此,当然有很多情况下传递指针是优选的,甚至是必要的。如果您事先知道该参数是可选的,那么允许它为NULL非常有用。同样,您可能事先知道该参数始终是动态分配的,并且已完成内存管理。