2011-11-24 16 views
5

は、私はクラスFooのを持っていると言うC++デ参照ポインタ間

class Foo { 
} 

I行い、次の割り当て:

Foo *ptrFoo=new Foo(); 

Foo &ref=*(ptrFoo); //question 1 
Foo afoo=*(ptrFoo); //quesion 2 

私の質問:

1)に "& REFを" assignming内部的にはメモリの点で何が起こるのでしょうか? "ptrFoo"のメモリアドレスを "ref"に割り当てるだけですか?

2)「afoo」に割り当てるとき、何が起こりますか?コピーコンストラクタを呼び出しますか?つまり、メモリは2つのFooオブジェクトに割り当てられますか?すなわち "afoo"と "ptrFoo"のための以前に割り当てられたメモリ?

3)は、私が "無効methodBar(のconst Fooのインスタンス&)" と呼ばれる方法があるだろう 私は "ptrFoo" を渡す場合をなど:

methodBar((* preFoo));

「const」の意味は?

答えて

8

1) "& ref"に割り当てるとき、内部的にメモリの中で何が起こるのですか? "ref"に "ptrFoo"のメモリアドレスを割り当てるだけですか?

プラットフォーム、コンパイラ、およびコンパイラの設定によって異なります。あなたのコンパイラは逆参照の同義語を生成するだけかもしれません。参照が再定義されない可能性があるため、コンパイラが本当に変数にメモリを割り当てる必要はありません。

2)「afoo」に割り当てるとき、何が起こりますか?コピーコンストラクタを呼び出しますか?つまり、メモリは2つのFooオブジェクトに割り当てられますか?すなわち "afoo"と "ptrFoo"のための以前に割り当てられたメモリ?

はい、動的記憶装置に記憶されているFooの内容は、自動ストレージにFooのインスタンスに(コピーコンストラクタを使用して)コピーされます。しかしここには動的割り当てはありません。 aFooインスタンスは、割り当てがなかった場合と同様に作成されます。たとえば、Foo aFoo;です。

3)は、私が "無効methodBar(のconst Fooのインスタンス&)" 私はとして "ptrFoo" を渡す場合: methodBar((* preFoo)というメソッドを持っていると言います)。 ここで "const"の意味は?その位置に

constアイテムが参照によって渡されている間、その参照const宣言方法をインスタンスを参照の参照を変更することができないことを意味します。

4
  1. Foo& ref = *ptrFoo;を行うとき、あなたは*ptrFooへの参照を行っています。この時点ではFooが1つのみ存在します。 refまたは*ptrFooに変更すると、同じオブジェクトに影響します。

  2. あなたは(Foo afoo = ref;と同じである)Foo afoo = *ptrFoo;を行うと、あなたが独立して*ptrFooの存在する、Foo別別々に作成します。 Fooのコピーコンストラクタによって初期化されます。スタックにはafooが存在しますが、フリーストア(ヒープ)には*ptrFooが存在します。 *ptrFooの変更はafooに、の変更はには適用されません。またafooが破壊され、それがスコープ外になったときにそのメモリは自動的に解放されたが、*ptrFooが破壊されている必要があり、そのメモリが、この場合にdelete ptrFoo;

  3. constを行うことによって明示的に解放されたことに注意して、関数がへの参照を受け入れることを意味し変更しないことを約束するFooconstとしてマークされていないメソッドFooを呼び出すことはできません。また、この関数を呼び出すと、新しいFooは作成されません(つまり、値渡しされません)。

2

1)ptrFooが指すオブジェクトへの参照を作成しています。新しいオブジェクトは作成されません。

2)コピーコンストラクタが呼び出され、Foo型の新しいオブジェクトが作成されています。

3)constは、データを変更しないオブジェクトへの参照を渡すことを意味します。

2

1)*(ptrFoo)によって返されたオブジェクトのメモリアドレスを割り当てます。これはptrFooに相当します。

2)コピーコンストラクタが呼び出されます。ヒープ上に割り当てられ、ptrFooが指し示すオブジェクトと、スタックに割り当てられた別のオブジェクトがあり、afooという名前の2つのオブジェクトが作成されました。

3)constは、方法methodBarが、の名前のinstanceによって参照されるオブジェクトを変更できないことを意味します。 Fooのメソッドは、constとマークされている場合にのみ呼び出すことができます。

関連する問題