问题很简单,之前可能已经讨论过了,但我可以为我的案例找到一个明确的答案。假设我将指针对象传递给函数
#include "foo.h"
int main()
{
foo * aFoo = new foo;
bar(aFoo);
delete aFoo;
aFoo = NULL;
return 0;
}
然后函数就像这样写了
void bar (foo *f)
{
f->insert();
}
问题:
那是call by value
还是call by reference
?我知道在按值调用时,将对象从main()复制到bar()会产生开销。所以我想确定这是一个call by reference
。
答案 0 :(得分:11)
这是一个按值调用,其中指针 aFoo
的值被复制到函数参数f
中。
通过引用调用是一个调用,其中参数是引用,并且参数上的副作用(而不是该参数可能指向的对象)当函数返回时,函数内部发生的函数对调用者是可见的。
因此,例如,这是一个通过引用接受参数的函数:
void bar(foo*& f)
// ^
// Here you are taking a pointer by reference
虽然这是一个按值接受参数的函数:
void bar(foo* f)
// ^
// Here you are taking a pointer to foo by value
您可能会因参考和写作foo
而感到困惑:
void bar(foo& f)
{
f.insert();
}
与通过值将指针传递给同一个foo
对象并写入几乎相同的效果:
void bar(foo* f)
{ // Precondition: f != nullptr
f->insert();
}
然而,这两件事在概念上是不同的。当函数从调用函数之前的值/状态返回时,在第一种情况下传递的对象的值/状态可能不同,在第二种情况下,指针的值 你提供的内容与调用bar()
之前的内容相同 - 而指向的对象可能已经发生了某些状态更改。
另请注意,指针可以为null,而引用始终绑定到对象。
答案 1 :(得分:1)
在你的情况下,正式指向Foo的指针是call by value
。但是,由于您将指针传递给函数而不是类实例本身,因此它在类实例方面通过引用进行概念调用,因为函数调用不会复制整个实例而只复制其指针
Foo fooInstance;
// providing a way to point (less formally you can call it refer) to the instance
Foo* fooPointer = &fooInstance;
// this function call is call by value (passing the value of the pointer).
// but you can logically view it as 'call by reference' to fooInstance.
bar(fooPointer);