我应该在哪里select通过引用或传递值?

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

有五个主要的情况,你应该使用pass-by-reference来传递值:

  1. 如果您正在调用需要修改其参数的函数,请使用pass-by-reference作为获取此效果的唯一方法(在此情况下,我可以交替使用pass-by-reference和pass-by-pointer,你经常不得不显式检查NULL)。
  2. 如果你正在调用一个需要把一个大对象作为参数的函数,可以通过const引用来传递它,以避免对该对象进行不必要的拷贝,从而大大提高效率。
  3. 如果你正在编写一个定义必须引用的拷贝构造函数,请使用引用传递。
  4. 如果您正在编写一个想要在多态类上运行的函数,请使用引用传递或传递指针来避免切片。
  5. 如果您正在编写可能会返回非常大或不可复制的对象的函数,请使用传递引用作为使用参数来存储生成的值的方式。

有几个考虑因素,其中包括:

性能

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

修改

按值传递复制数据,如果目标代码修改该复制,则不会影响原始数据。 按引用传递仅传递数据的地址,因此对该引用进行的修改将对调用代码“可见”。

是。

像本地types这样足够小的东西,直接传递它们是有效的。 否则使用传递( const )引用。

最难的部分是编写一个可以适用于任何一个模板的模板(在这种情况下,您通常会使用通过引用的方式 – 通过价值传递大型对象的潜在处罚远远低于通过传递时通过引用的潜在处罚按价值会是首选)。

编辑:当然,这是假设所需的语义允许任何一个的情况 – 显然,如果您正在使用像多态对象的东西,没有真正的“首选项”,因为您必须使用指针或引用得到正确的行为。

正如其他人已经很好地回答了你的问题,我想补充一点:

如果这个类没有public复制构造函数,那么你就没有select按值传递; 你必须通过引用传递(或者你可以传递指针)。

下面的程序不会编译:

 class A { public: A(){} private: A(const A&) {} }; //source of error : pass by value void f(A ) {} int main() { A a; f(a); return 0; } 

错误:

prog.cpp:在函数'int main()'中:
prog.cpp:10:错误:'A :: A(const A&)'是私人的
prog.cpp:18:错误:在此上下文中
prog.cpp:18:错误:初始化“void f(A)”的参数1

在ideone上看看你自己: http : //www.ideone.com/b2WLi

但是,一旦你使函数f通过引用,那么它编译罚款: http : //www.ideone.com/i6XXB

你已经用C和C ++标记了你的问题。

因此,我build议你考虑在C ++中使用传递引用,它支持这个特性,并且你不考虑在C中不支持这个特性。

虽然指针是引用,但c ++中的“引用”通常是指标记SomeType&的参数的做法。

你永远不应该这样做。 唯一适合的地方是作为实现各种预定义操作符所需的魔法语法。 除此以外:

  • 你不应该通过引用传递参数 – 传递指针,否则你做代码评论几乎不可能。 通过引用使得通过检查呼叫可以预测哪些参数可以被改变是不可能的。

  • 您不应该通过参考传递参数。 同样,这意味着您正在执行元优化。 你应该永远只是传递价值,否则你是有罪的在一个对象内窥视,检查它的实现,并决定通过引用是由于某种原因的首选。

任何c ++类都应该实现所有需要按值传递的复制和赋值构造函数和重载。 否则,它没有完成它的工作,从程序员的实现细节中抽象出来。