提供,我想将一个可修改的参数传递给一个函数,我应该选择什么:通过指针传递它还是通过引用传递它?
我问这是因为我一直认为这是通过引用(1)传递参数的最佳实践,但在检查了一些本地代码数据库后,我得出结论,最常见的方法是(2)。此外,该男子本人(Bjarne Stroustrup)建议使用(2)。 (1)和(2)的[dis]优点是什么,或者只是个人品味的问题?
答案 0 :(得分:22)
我更喜欢参考而不是指针:
有些人说虽然引用和const引用之间的区别对于很多人来说太微妙了,并且在调用该方法的代码中是不可见的(即,如果你读取通过引用传递参数的调用代码,你无法看到它是一个const还是一个非const引用),因此你应该把它作为一个指针(在调用代码中使它明确表示你给出了变量的地址,因此你的变量的值可能会被被调用者改变。
我个人更喜欢参考,原因如下:
[1.]意味着使调用者可见性变得无关紧要,因为调用者应该(通过其他方式)理解子例程的作用(包括它将修改参数的事实)。 / p>
[2.]意味着如果它是一个指针,那么子程序应该处理参数为空指针的可能性,这可能是额外的和IMO无用的代码。
此外,每当我看到一个指针,我想,“谁会删除它,何时?”,所以无论何时/何地所有权/生命/删除都不是问题,我更喜欢使用引用。
为了它的价值,我养成了编写const-correct代码的习惯:所以如果我声明一个方法有一个非const引用参数,那么它是非const的事实是重要的。如果人们没有编写const-correct代码,那么可能更难判断一个参数是否会在子例程中被修改,而另一个机制的参数(例如指针而不是引用)会更强一些。 / p>
答案 1 :(得分:5)
通过引用传递的优点:
按值传递指针的优点:
由于引用传递是在语言中,因此任何非指针参数也可能会被修改,并且您知道指针值正在被更改。我见过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非常有用。同样,您可能事先知道该参数始终是动态分配的,并且已完成内存管理。