繁体   English   中英

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

[英]When should I use a reference?

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

funca (scalar& a)
// Etc

有时候他只是用

funcb (scalar a)
// Etc

有什么不同? 使用参考是我应该养成的良好习惯吗?

谢谢!

如果调用foo(scalar a) ,则调用者将复制scalar类型的参数a ,而foo将拥有原始对象的COPY。

如果调用foo(scalar &b) ,则参数b只是对原始对象的引用,因此您可以对其进行修改。

使用&name语法通过引用传递对象的速度更快,因为它避免了创建给定对象的副本,但是这样做可能具有潜在的危险,并且有时行为是不需要的,因为您只是想要一个实际的副本。

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

可选阅读,请仔细:

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

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

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

另请参见C ++中的按引用/值传递

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

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

通过引用进行呼叫是否是一种良好做法,取决于情况。 如果您需要该函数来修改自变量(以及对调用者可见的修改),则显然要使用按引用调用。 如果您不想使用非常量引用参数来修改参数,则会引起误解(因为签名表明可以更改参数),因此按值调用在此处更为合适。 当然,对于更复杂的类型,按值调用可能会产生不小的开销。 在这些情况下,最好使用按常量引用调用( funcc(const scalar& c)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM