这两种用C ++编写函数的方法有什么区别? 它们都是“通过引用传递”吗?通过“通过引用传递”,我的意思是该函数能够改变原始对象(除非有另一个定义,但这是我的意图)。
根据我的理解,当你调用f1时,你会传入原始对象的“同义词”。当你调用f2时,你传入一个指向该对象的指针。使用f2调用时,是否会创建一个新的Object *,而在使用f1调用时,什么都没有?
f1 (Object& obj) {}
f2 (Object* obj) {}
谢谢!
答案 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==&o1
是true
)f2 (Object* obj) {}
当您致电f2
时,例如f1(&o1)
:
obj
使用&o1
创建并初始化;类似于:f2(){ Object* obj=&o1; // just for understanding what happens when you call f2(&o1) ...