按参数引用或按参数引用之间的差异

Difference between reference by argument or reference by parameter?

本文关键字:引用 参数 之间      更新时间:2023-10-16

我想知道将对象引用作为参数或参数传递之间是否有任何区别。下面的代码是等效的吗?是否存在我应该使用其中一种的情况?

void foo(Object &object){
    object.update()
}
 Object object
 foo(object)

void bar(Object *object){
     object->update()
}
Object object
bar(&object)

你似乎有点困惑。您的所有示例都没有按值传递。第一个示例通过引用传递,第二个示例通过指针传递。

主要区别是:

按值传递 foo(Object object) :该函数获取参数的副本,并且无法更改原始参数。

通过引用传递foo(Object& object):该函数获取对原始对象的引用(而不是复制)并可以对其进行修改。引用不能是"未绑定的",它们总是引用一个有效的对象(某些例外通常是错误)。

通过指针传递 foo(Object* object) :作为通过引用传递,除了指针不引用任何内容是有效的(它可以是nullptr如果您需要发出信号,这很有用)。

当您通过引用获取并且函数可以内联时,编译器 - 理论上 - 不需要生成实例的地址。根据您的类型,一元前缀operator&()可能不仅仅是返回this。此外,指针为 nullptr 是有效的,您应该检查这一点(或使用 gsl 的 not_null )。