2

当我在 c++ 中使用指针而不是从 this 对对象方法进行函数调用时,有什么区别:

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 中得到了我需要的东西

4

2 回答 2

2

首先,该代码无法编译。

在第二个片段中,foo是一个指针,并且obj是一个对象。当它需要一个对象时,您正在调用 foo.someMethod(obj) Foo*。与第一个片段相同。

从我看你的意思是:

obj.someMethod(foo);

解释:

在第一个片段中,foo是一个对象。对象作为 COPY 传递给someMethod函数。(按值调用)。对fooin所做的更改someMethod不会反映在fooof 中Main::Init()

在第二个片段中,foo作为指向对象的指针发送。它被称为“引用调用”。的地址foo将被发送到,someMethod以便它可以修改对象或对其进行某些操作

于 2012-10-25T06:36:08.433 回答
2
someMethod(Foo f)

f通过实例传递的对象,即f成为foo传递给函数的实际参数的副本。f对by所做的任何修改someMethod都不会改变foo

通常,通过const 引用传递 f 会更有效: someMethod(const Foo& f)。因此,可以避免复制,并且调用 in 的非常量方法fsomeMethod导致编译器错误。

someMethod(Foo *f)

f一个指向对象的指针。如果实际参数已初始化(与您的示例不同),则对指向的对象foo所做的任何修改实际上都将应用于 . 指向的对象。someMethod ffoo

someMethod(Foo *& f)

f对指向对象的指针的引用。这通常用于声明指针类型的输出参数。例子:

void someMethod(Foo *& f)
{
  f = new Foo();
}

作为f对实际参数的引用,在函数出口处分配Foo* foo的结果。new Foofoo

于 2012-10-25T07:08:54.020 回答