通过值|引用调用的另一个问题

mah*_*ood 4 c++ pass-by-reference call-by-value

问题很简单,之前可能已经讨论过,但我可以为我的案例找到一个明确的答案.假设我将指针对象传递给函数

#include "foo.h"
int main()
{
   foo * aFoo = new foo;
   bar(aFoo);
   delete aFoo;
   aFoo = NULL;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后函数就像这样写

void bar (foo *f)
{
  f->insert();
}
Run Code Online (Sandbox Code Playgroud)

问题:

那是一个call by value还是call by reference?我知道在按值调用时,将对象从main()复制到bar()会产生开销.所以我想确定这是一个call by reference.

And*_*owl 11

它是一个按值调用,其中指针 的值aFoo被复制到函数参数中f.

通过引用调用是一个调用,其中参数是一个引用,当函数返回时,调用程序可以看到函数内部发生的参数(而不是该参数可能指向的对象)的副作用.

因此,例如,这是一个通过引用接受参数的函数:

void bar(foo*& f)
//           ^
//           Here you are taking a pointer by reference
Run Code Online (Sandbox Code Playgroud)

虽然这是一个按值接受参数的函数:

void bar(foo* f)
//          ^
//          Here you are taking a pointer to foo by value
Run Code Online (Sandbox Code Playgroud)

你可能会foo因参考和写作而感到困惑:

void bar(foo& f)
{
    f.insert();
}
Run Code Online (Sandbox Code Playgroud)

与通过值传递指向同一foo对象并写入的效果几乎相同:

void bar(foo* f)
{ // Precondition: f != nullptr
    f->insert();
}
Run Code Online (Sandbox Code Playgroud)

然而,这两件事在概念上是不同的.当函数从调用函数之前的值/状态返回时,在第一种情况下传递的对象的值/状态可能不同,在第二种情况下,您提供的指针的值将与它相同在你打电话之前bar()- 指向的对象可能已经经历了一些状态变化.

另请注意,指针可以为null,而引用始终绑定到对象.