4

質問は単純で、以前に議論されたかもしれませんが、私の場合は明確な答えを見つけることができました. 関数にポインター オブジェクトを渡すとします。

#include "foo.h"
int main()
{
   foo * aFoo = new foo;
   bar(aFoo);
   delete aFoo;
   aFoo = NULL;
   return 0;
}

次に、関数は次のように記述されます

void bar (foo *f)
{
  f->insert();
}

質問:

それはcall by valueまたはcall by referenceですか?値による呼び出しでは、オブジェクトを main() から bar() にコピーするためのオーバーヘッドがあることを知っています。だから私はそれがであることを確認したいcall by reference.

4

2 に答える 2

11

これは値による呼び出しであり、ポインター の値がaFoo関数パラメーターにコピーされますf

参照による呼び出しは、パラメーターが参照である呼び出しであり、関数内で発生する引数(その引数によって指されている可能性のあるオブジェクトではなく)に対する副作用は、関数が戻るときに呼び出し元に表示されます。

たとえば、これは参照によってパラメーターを受け入れる関数です。

void bar(foo*& f)
//           ^
//           Here you are taking a pointer by reference

これは値によってパラメーターを受け入れる関数ですが、次のようになります。

void bar(foo* f)
//          ^
//          Here you are taking a pointer to foo by value

fooあなたはおそらく、参照によって取得して次のように書くという事実に困惑しています。

void bar(foo& f)
{
    f.insert();
}

同じオブジェクトへのポインターを値で渡し、次のように記述するのとほぼ同じ効果があります。foo

void bar(foo* f)
{ // Precondition: f != nullptr
    f->insert();
}

ただし、この 2 つのことは概念的に異なります。最初のケースで渡したオブジェクトの値/状態は、関数が関数を呼び出す前の値/状態から戻ったときに異なる場合がありますが、2 番目のケースでは、指定したポインターの値はそれと同じになります。あなたが呼び出す前でした-指してbar()いるオブジェクトが何らかの状態変化を起こしている可能性があります。

また、参照は常にオブジェクトにバインドされますが、ポインターは null になる可能性があることに注意してください。

于 2013-06-13T17:40:39.147 に答える
1

あなたの場合、call by value正式には Foo へのポインタの観点からです。ただし、クラス インスタンス自体ではなく関数へのポインターを渡すため、関数呼び出しはインスタンス全体ではなくそのポインターのみをコピーするため、クラス インスタンスに関して概念的に参照によって呼び出されます。

Foo fooInstance;
// providing a way to point (less formally you can call it refer) to the instance
Foo* fooPointer = &fooInstance;

// this function call is call by value (passing the value of the pointer).
// but you can logically view it as 'call by reference' to fooInstance.
bar(fooPointer); 
于 2013-06-13T18:01:14.183 に答える