web-dev-qa-db-ja.com

コピーコンストラクタと代入演算子

operator=をオーバーライドすると、コピーコンストラクターは自動的にnew演算子を使用しますか?同様に、コピーコンストラクターを定義すると、operator=は自動的にコピーコンストラクターの動作を「継承」しますか?

50
Paul Manta

いいえ、それらは異なる演算子です。

コピーコンストラクタは、新しいオブジェクトを作成するためのものです。既存のオブジェクトを新しく構築されたオブジェクトにコピーします。コピーコンストラクタは、古いインスタンスから新しいインスタンスを初期化するために使用されます。関数に値で変数を渡すとき、または関数からの戻り値として、必ずしも呼び出されるとは限りません。

代入演算子は、既存のオブジェクトを処理します。代入演算子は、既存のインスタンスを変更して右辺値と同じ値を持たせるために使用されます。つまり、内部動的メモリがある場合、インスタンスを破棄して再初期化する必要があります。

便利なリンク:

44
sgokhales

いいえ。コピーアクターを定義しない限り、デフォルトが生成されます(必要な場合)。 operator =を定義しない限り、デフォルトが生成されます(必要な場合)。それらは相互に使用することはなく、個別に変更できます。

12
Erik

いいえ。それらは異なるオブジェクトです。

コピーコンストラクタと代入演算子の間のコードの重複が懸念される場合は、 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とともに)リリースされます。

5
Alexandre C.

いいえ、それらは同じ演算子ではありません。

1
Jonathan Wood

いや.

そして間違いなく つの規則 (または右辺値を考慮に入れる場合は 5つの規則 を見てください)

0
stijn