这两个方法声明都是“通过引用传递”吗?

时间:2011-06-02 22:10:42

标签: c++ function pointers pass-by-reference

这两种用C ++编写函数的方法有什么区别? 它们都是“通过引用传递”吗?通过“通过引用传递”,我的意思是该函数能够改变原始对象(除非有另一个定义,但这是我的意图)。

根据我的理解,当你调用f1时,你会传入原始对象的“同义词”。当你调用f2时,你传入一个指向该对象的指针。使用f2调用时,是否会创建一个新的Object *,而在使用f1调用时,什么都没有?

f1 (Object& obj) {}
f2 (Object* obj) {}

谢谢!

5 个答案:

答案 0 :(得分:3)

您的理解是正确的。

从技术上讲,f2是按值传递的,值是指针,但您可以使用该指针的副本来修改指向的对象。

答案 1 :(得分:3)

在一般意义上它们都是 pass-by-reference ,但是这个短语通常不会用于描述指针版本,因为它可能与C ++ 引用类型混淆

答案 2 :(得分:2)

这两种用C ++编写函数的方法有什么区别? f1通过引用传递一个对象,f2通过值传递一个指针。两者都能够通过引用直接修改对象f1,通过取消引用指针来修改f2。

通过f2调用,是否会创建一个新的Object *,而在使用f1调用时,什么都没有? f2可以在该地址分配一个新对象,或者根据该地址使用已经分配的对象。但是,按值传递指针不会调用new它只是指针的副本,它可能会或可能不会指向有效的已分配对象。

查看由pst发布的评论的wiki链接。

答案 3 :(得分:1)

指针可以为null,而引用则不能。

请参阅:

What are the differences between a pointer variable and a reference variable in C++?

答案 4 :(得分:1)

f1 (Object& obj) {}

当您致电f1时,例如f1(o1)

  • 对于obj别名),o1变为另一个名称,就是这样。因此o1只是obj的别名;他们有相同的地址(您可以检查&obj==&o1true

f2 (Object* obj) {}

当您致电f2时,例如f1(&o1)

  • obj 使用&o1创建并初始化;类似于:
 f2(){
    Object* obj=&o1; // just for understanding what happens when you call f2(&o1)
    ...