2017-08-16 6 views
-1

私は以下のコードを書いています。C++でオブジェクトを再構築し、同じ型に割り当てる

V v(10,0);//first argument is size and the second is init val for each element 
... 
v = V(5,0); 

V(5,0)を呼び出して2番目の行のvに割り当てると、以前に割り当てられたvは自動的に破棄されますか?タイプVの新しいオブジェクトが作成され、vに割り当てられていますか?私はその場で何が起こっているのか十分に理解していません。

+1

[割り当て演算子](http://en.cppreference.com/w/cpp/language/operator_assignment)で読み上げるような音です。 – tadman

答えて

3
V v(10,0); 

コンパイラは、コールスタック(ないヒープ)の上にいくつかの領域を割り当て、その後、オブジェクトを構築するために、メモリ内のその場所にV(int,int)コンストラクタを呼び出します。再び

....V(5,0). 

v = V(5,0); 

これは実際に私が分離ういくつかの部分であり、コンパイラは、コールスタック(ないヒープ)の上にいくつかの領域を割り当て、その後にV(int,int)コンストラクタを呼び出します。一時的な名前のないオブジェクトを作成するために、メモリ内に配置されます。

v = ....... 

コンパイラは、名前のvオブジェクトにパラメータ(一時的な無名のV)からの、おそらく内容をコピー、v.operator=(const V&)メンバーを呼び出します。

..........; 

式が終了したので、コンパイラは一時オブジェクトを破壊する~Vデストラクタを呼び出し、その後、(おそらく)後の再利用のためのコールスタック上のスペースを解放します。

ときにスコープが終了する(通常:関数が終了したとき)、コンパイラが自動的に命名 vオブジェクトを破壊する ~Vデストラクタを呼び出し、その後、コールスタック上のスペースの割り当てを解除します。

+0

'operator =(const V&)'はコンパイラによって生成されたこの演算子のコードですか? – marc

+0

'V(10,0)'に割り当てられたメモリ空間はどうなりますか?その元のオブジェクトが破壊されるか、それとも破壊する必要がありますか? – marc

+0

関数が終了したとき。答えに追加されました。 –

関連する問題