c ++将指针传递给函数

时间:2012-10-25 06:28:55

标签: c++ pointers

当我用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

2 个答案:

答案 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的副本。 fsomeMethod所做的任何修改都不会改变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