按值调用|引用的另一个问题
yet another issue with call by value|reference
这个问题很简单,以前可能已经讨论过了,但是我可以为我的情况找到一个明确的答案。假设我传递一个指针对象给函数
#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
。
这是一个按值调用,其中指针 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()
之前的值相同-而指向的对象可能经历了一些状态更改。
还要注意,指针可以为空,而引用总是绑定到对象。
在您的例子中,就指向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);
相关文章:
- 存储另一个函数返回的布尔数组时遇到问题
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 在另一个类中创建类实例时出现问题
- 使用另一个函数调用一个函数(都在类中)时出现问题.没有错误代码C++
- 缺少类型说明符和另一个问题
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 从另一个应用启动我的应用时出现相对路径更改问题
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- C BITSHIFT导致另一个变量引起问题
- C++中嵌套在另一个 LinkedList 中的 LinkedList 整数上的回调函数问题
- 问题:字符串在另一个字符串上写入
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- "{"令牌 c++ 继承问题之前的另一个预期类名
- QT/C++关于访问UI文件的另一个问题
- 按值调用|引用的另一个问题
- 另一个问题:通过引用传递参数
- BGL反序列化的另一个问题
- decltype的另一个问题