operator=
をオーバーライドすると、コピーコンストラクターは自動的にnew演算子を使用しますか?同様に、コピーコンストラクターを定義すると、operator=
は自動的にコピーコンストラクターの動作を「継承」しますか?
いいえ、それらは異なる演算子です。
コピーコンストラクタは、新しいオブジェクトを作成するためのものです。既存のオブジェクトを新しく構築されたオブジェクトにコピーします。コピーコンストラクタは、古いインスタンスから新しいインスタンスを初期化するために使用されます。関数に値で変数を渡すとき、または関数からの戻り値として、必ずしも呼び出されるとは限りません。
代入演算子は、既存のオブジェクトを処理します。代入演算子は、既存のインスタンスを変更して右辺値と同じ値を持たせるために使用されます。つまり、内部動的メモリがある場合、インスタンスを破棄して再初期化する必要があります。
便利なリンク:
いいえ。コピーアクターを定義しない限り、デフォルトが生成されます(必要な場合)。 operator =を定義しない限り、デフォルトが生成されます(必要な場合)。それらは相互に使用することはなく、個別に変更できます。
いいえ。それらは異なるオブジェクトです。
コピーコンストラクタと代入演算子の間のコードの重複が懸念される場合は、 copyおよびswap という名前の次のイディオムを検討してください。
struct MyClass
{
MyClass(const MyClass&); // Implement copy logic here
void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)
MyClass& operator=(MyClass x)
{
x.swap(*this);
return *this;
}
};
このように、operator=
は、コピーコンストラクターを使用して新しいオブジェクトを作成し、*this
および関数の終了時に(古いthis
とともに)リリースされます。
いいえ、それらは同じ演算子ではありません。