当我用c ++调用函数调用带有指针的对象方法时有什么区别 从这个:
void Main::Init()
{
Foo foo;
Obj obj;
Obj.someMethod(foo) // signeture : someMethod(Foo f)
}
到此:
void Main::Init()
{
Foo* foo = new foo();
Obj obj;
Obj.someMethod(foo) // signeture : someMethod(Foo* f)
}
更新
或者这个:
void Main::Init()
{
Foo* foo = new foo();
Obj obj;
Obj.someMethod(foo) // signeture : someMethod(Foo *& f)
}
什么是更好的内存和编译器更好的建议 在实际中我没有看到任何差异我得到我需要的Foo
答案 0 :(得分:2)
首先,代码无法编译。
在第二个片段中,foo
是一个指针,obj
是一个对象。当你期望一个Foo*
对象时,你正在调用foo.someMethod(obj)。与第一个片段相同。
从我看到你的意思:
obj.someMethod(foo);
说明:
在第一个代码段中,foo
是一个对象。该对象作为COPY传递给someMethod
函数。(按值调用)。对foo
中的someMethod
所做的更改不会反映在foo
的{{1}}中。
在第二个片段中,Main::Init()
作为指向对象的指针发送。它被称为“参考呼叫”。 foo
的地址将发送至foo
,以便修改对象或使用
答案 1 :(得分:2)
someMethod(Foo f)
f
是实例传递的对象,即f
成为传递给函数的实际参数foo
的副本。 f
对someMethod
所做的任何修改都不会改变foo
。
通常,通过一个const引用:someMethod(const Foo& f)
传递f会更有效。因此,可以避免复制,并且在f
中调用someMethod
的非常量方法会导致编译器错误。
someMethod(Foo *f)
f
是指向对象的指针。如果实际参数foo
已初始化(与您的示例不同),则someMethod
对 f
所指向的对象所做的任何修改都将实际应用于该对象由foo
指出。
someMethod(Foo *& f)
f
是对指向对象的指针的引用。这通常用于声明指针类型的输出参数。例如:
void someMethod(Foo *& f)
{
f = new Foo();
}
由于f
是对实际参数Foo* foo
的引用,new Foo
的结果会在函数出口处分配给foo
。