我应该在哪里选择传递引用或按值传递?

mr_*_*air 22 c++ function pass-by-reference pass-by-value

我应该在什么情况下更喜欢传递参考?传递的价值?

tem*_*def 31

有五种主要情况应该使用pass-by-reference而不是pass-by-value:

  1. 如果你拨打的需要修改其参数的函数,用传址引用作为其获得这种效果(我把通过按参考,并互换在这种情况下传递的指针,虽与通的唯一途径-by-pointer你经常需要显式检查NULL).
  2. 如果您正在调用需要将大对象作为参数的函数,请通过const引用传递它,以避免对该对象进行不必要的复制并大幅提高效率.
  3. 如果您正在编写一个复制构造函数,根据定义必须使用引用,请使用按引用传递.
  4. 如果您正在编写一个想要对多态类进行操作的函数,请使用按引用传递或传递指针以避免切片.
  5. 如果您正在编写可能返回非常大或不可复制对象的函数,请使用按引用传递作为使用参数存储生成的值的方法.

  • 在第1种情况下,如果你不想要一个NULL参数,那么首选引用是首选,所以我不会完全使用"可互换" (5认同)
  • @Chris Becke-你确实对一个物体的大小有一点看法.但是,我的后续问题是这样的:假设在C++中默认情况下所有参数都是按值传递的,由于副本的原因,这可能比通过引用传递成本大得多,您建议通过引用传递什么替代方法避免不必要的性能命中?并且相同的参数不适用于指针传递吗?另外,对于你的最后两点,为什么通过指针是一个更好的选择?是否有一个特殊的原因,它比通过引用传递更优雅的方法?最后,1如何违反最少的惊喜? (4认同)
  • @Chris Becke-你能详细说明你的答案吗?我不同意你几乎所有的断言,所以我想听听你对此的看法. (3认同)
  • @Chris 2如何违反封装?如果有的话,1是违反封装的(因为代替`someFunc(obj)`最好使用`obj.someFunc()`)但是有很多时候仍然首选1,例如`void someFunc(Obj obj){this.registerSomeFunc(); obj.someFunc(); 无论如何,对于除了最琐碎的物体之外的所有物体,除了**之外,其他都是**. (3认同)
  • 我不同意.对象的内部大小取决于它是否要告诉我.对象的物理尺寸不是内部属性,而是外部属性,不应被视为受封装保护. (2认同)
  • @Chris:我不时地听到这个"指针"的论点,但坦率地说,我并没有留下深刻的印象.您可以交换调用者的"通知"以查找可能的"nullptr"问题.我更喜欢保护后者,并为函数提供一个足够描述性的名称,以便表达可能的修改......如果有的话. (2认同)

Ken*_*art 7

有几个考虑因素,包括:

性能

传递值会复制数据,因此按值传递大型数据结构会抑制性能.通过引用传递仅将引用(基本上是地址)传递给数据.对于大型数据结构,这可以大大提高性能.对于较小的数据结构(如int),通过引用传递可能会抑制性能.

修改

按值传递会复制数据,因此如果目标代码修改了该副本,则不会影响原始数据.通过引用传递仅传递数据的地址,因此针对该引用的修改将对调用代码"可见".