1

独自の等号演算子 ( = ) を実装した MyPoly クラスがあります。このコードを試すと、すべて正常に動作し、実装された = が呼び出されています。

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy;
copy = mp;

しかし、私がこれを書くとき:

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

実装された = を使用せず、デストラクタが呼び出されると実行時エラーが発生します。

これらのコードが異なる理由を誰かが説明できますか?

4

4 に答える 4

8

この行

MyPoly copy = mp;

コピーの初期化であるため、代入演算子 (「等号演算子」と呼ばれるもの) を呼び出すのではなく、シグネチャを持つコピー コンストラクターを呼び出します。

MyPoly(const MyPoly&); 

独自のものを指定しない限り、コンパイラによって生成されます。実行時エラーに関しては、さらにコードを提供する必要があります。ただし、独自の代入演算子を作成したため、動的に割り当てられたリソースを処理している可能性があると推測できます。その場合、3 のルールに従い、独自のコピー コンストラクターとデストラクターを実装する必要があります。また、C++11 をサポートしている場合は、それを 5 のルールに拡張し、独自のムーブ コピー コンストラクターとムーブ代入演算子を提供する必要があります。

于 2012-09-06T11:52:57.427 に答える
4

これ

MyPoly copy = mp;

代入ではなくコピー初期化です。代入演算子ではなく、コピー コンストラクターを使用します。

MyPoly copy(mp);

直接初期化

MyPoly copy;
copy = mp;

譲渡です。

于 2012-09-06T11:52:10.827 に答える
3
MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

copy c-torではなく、呼び出しますoperator =。それcopy initializationは両方の場合です。

于 2012-09-06T11:52:06.787 に答える
-1
MyPoly copy = mp;

以下と同じです:

MPoly copy(mp);

同様に、代入演算子の代わりにコピー コンストラクターを呼び出します。代入演算子と一緒にコピー コンストラクターを作成することは、常に良い考えです。

于 2012-09-06T11:51:54.693 に答える