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

Sad*_*ido 7 c++ parameters pointers reference

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

  1. bool GetFoo(Foo&whereToPlaceResult);
  2. bool GetFoo(Foo*whereToPlaceResult);

我问这个是因为我一直认为通过引用(1)传递参数是最好的做法,但在检查了一些本地代码数据库后,我得出结论,最常见的方法是(2).此外,该男子本人(Bjarne Stroustrup)建议使用(2).(1)和(2)的[dis]优点是什么,还是仅仅是个人品味的问题?

Chr*_*isW 22

在下列情况下,我更喜欢引用而不是指针:

  • 它不能为空
  • 它无法改变(指向别的东西)
  • 它不能被删除(通过谁接收指针)

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

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

  1. 我认为例程应该知道它正在调用什么子例程
  2. 子程序不应该假设它被调用的例程.

[1.]意味着使调用者可见性变得无关紧要,因为调用者应该(通过其他方式)理解子例程的作用(包括它将修改参数的事实).

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

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

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

  • 传入方法的指针无法更改为指向其他位置. (3认同)

T.E*_*.D. 5

通过引用传递的优点:

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

按值传递指针的优点:

  • 允许为"可选"参数传递null.有点丑陋的黑客,但有时很有用.
  • 强制调用者知道正在做什么与参数.
  • 在不必阅读API的情况下,为读者提供可能正在执行的操作的半个线索.

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

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