我什么时候应该使用参考?

时间:2012-05-29 22:00:03

标签: c++

新手在这里,我正在阅读一些代码,我发现有时作者在函数中使用了引用

funca (scalar& a)
// Etc

有时他只是使用

funcb (scalar a)
// Etc

有什么区别?使用引用是一种我应该拥有的好习惯吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

如果你打电话给foo(scalar a)a类型的scalar参数将从调用者处复制,而foo将拥有原始对象的自己的COPY。

如果您致电foo(scalar &b),参数b将只是对原始对象的引用,因此您可以修改它。

使用& name语法通过引用传递对象更快,因为它避免了创建给定对象的副本,但它可能有潜在危险,有时候这种行为是不必要的,因为你只需要一个实际的副本。 / p>

话虽如此,实际上有一个选项不允许修改被调用函数的原始对象,但避免创建副本。它是foo(const scalar &x),它明确指出调用者不希望函数foo修改作为参数传递的对象。

可选阅读,请仔细阅读:

还有一种方法可以将参数作为原始指针传递,这在现代C ++中非常罕见。谨慎使用:foo(scalar *a)。在这种情况下,调用者必须提供对象的地址而不是对象本身,因此调用者将调用foo(&a)。要使被调用函数foo能够在这种情况下修改对象本身,它需要取消引用指针a,如foo中所示: *a =。在这种情况下,变量名前面的星号表示我们不想修改我们收到的地址(作为提供&a的调用函数的直接结果,即对象的地址一个)。

答案 1 :(得分:5)

通过引用传递参数允许被调用函数以函数返回后调用者可见的方式修改其参数,而传递值意味着任何更改都将在范围内限制为被调用函数。因此,传递(非常量)引用通常表示被调用者打算修改参数,或者不太常见,将其用作附加的“返回值”。

此外,通过引用传递意味着不需要复制参数;传递值需要这样的副本(这可能对应用程序的内存占用或运行时性能有害)。因此,您经常会看到类类型的参数作为const引用传递:被调用者不打算修改参数,但它也希望避免复制。标量参数的大小非常小,因此它们不会从这种方法中受益。

另见Pass by Reference / Value in C++

答案 2 :(得分:1)

按值(funcb (scalar a))调用将为函数提供参数的副本,因此对参数所做的更改对调用者不可见。

通过引用调用(funcb(scalar& b))意味着函数直接对参数进行操作,因此对调用者可以直接看到所做的任何更改。

是否参考电话是一种好的做法取决于具体情况。如果您需要函数来修改参数(并且修改对调用者可见),您显然希望使用按引用调用。如果您不想使用非const引用参数修改参数会产生误导(因为签名表明参数可能已更改),因此按值调用更适合此处。当然,对于更复杂的类型,按值调用可能会产生非平凡的开销。在这些情况下,最好使用call-by-const-reference(funcc(const scalar& c)