2

thisからではなく、ポインターを使用してオブジェクトメソッドに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)
}

UPDATE
またはこれ:

 void Main::Init()
    {
        Foo* foo  = new foo();
        Obj obj;
        Obj.someMethod(foo)  // signeture : someMethod(Foo *& f)
    }

メモリとコンパイラの点でどちらが優れているか 実用的により推奨されるもの 両方に違いは見られません Foo から必要なものを取得します

4

2 に答える 2

2
someMethod(Foo f)

fインスタンスによって渡されるオブジェクトです。つまり、関数に渡されるf実際のパラメータのコピーになります。fooによって行われた変更は変更fされsomeMethodませんfoo

通常、 const参照でfを渡す方が効率的です:someMethod(const Foo& f)fしたがって、コピーは回避され、 inのnon-constメソッドを呼び出すと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

于 2012-10-25T07:08:54.020 に答える
2

まず、そのコードはコンパイルされません。

2 番目のスニペットでfooは、 はポインターで、objはオブジェクトです。オブジェクトが必要なときに foo.someMethod(obj) を呼び出していFoo*ます。最初のスニペットも同様です。

私があなたが意味したことから:

obj.someMethod(foo);

説明:

最初のスニペットでfooは、オブジェクトです。オブジェクトは COPY としてsomeMethod関数に渡されます (値による呼び出し)。で行った変更は、のには反映さfoosomeMethodません。fooMain::Init()

2 番目のスニペットでfooは、オブジェクトへのポインターとして送信されます。それは「参照による呼び出し」と呼ばれます。のアドレスfooが送信されsomeMethod、オブジェクトを変更したり、何かを実行したりできるようになります

于 2012-10-25T06:36:08.433 に答える