推奨されます, 2019

エディターズチョイス

C ++におけるコピーコンストラクタと代入演算子の違い

コピーコンストラクタと代入演算子は、あるオブジェクトを別のオブジェクトを使って初期化する2つの方法です。 コピーコンストラクタと代入演算子の基本的な違いは、コピーコンストラクタが両方のオブジェクト、つまり新しく作成されたターゲットオブジェクトとソースオブジェクトに別々のメモリを割り当てることです。代入演算子は、新しく作成されたターゲットオブジェクトと同じメモリ位置を割り当てます。ソースオブジェクト

コピーコンストラクタと代入演算子の違いを調べましょう。

比較表

比較基準コピーコンストラクタ代入演算子
基本コピーコンストラクタはオーバーロードコンストラクタです。代入演算子はビット演算子です。
意味コピーコンストラクタは、新しいオブジェクトを既存のオブジェクトで初期化します。代入演算子は、あるオブジェクトの値を別のオブジェクトに代入します。どちらもすでに存在しています。
構文class_name(cont class_name&object_name){
//コンストラクタの本体
}
クラス名Ob1、Ob2。
Ob2 = Ob1。
呼び出し(1)コピーコンストラクタは、新しいオブジェクトが既存のオブジェクトで初期化されたときに呼び出されます。
(2)非参照パラメーターとして関数に渡されたオブジェクト。
(3)関数からオブジェクトが返されます。
代入演算子は、既存のオブジェクトに新しいオブジェクトを代入するときにだけ呼び出されます。
メモリ割り当てターゲットオブジェクトと初期化オブジェクトの両方が、異なるメモリ位置を共有します。ターゲットオブジェクトと初期化オブジェクトの両方が同じ割り当てられたメモリを共有します。
デフォルトプログラムでコピーコンストラクタを定義しない場合は、C ++コンパイラによって暗黙的にコピーコンストラクタが提供されます。"="演算子をオーバーロードしないと、ビット単位のコピーが作成されます。

コピーコンストラクタの定義

「コピーコンストラクタ」は、 オーバーロードされたコンストラクタの形式です。 コピーコンストラクタは、初期化の目的でのみ呼び出されるか呼び出されます。 コピーコンストラクタは、新しく作成されたオブジェクトを別の既存のオブジェクトによって初期化します。 コピーコンストラクタを使用して新しく作成されたターゲットオブジェクトを初期化すると、ターゲットオブジェクトとソースオブジェクトの両方が異なるメモリ位置を共有します。 ソースオブジェクトに加えられた変更は、ターゲットオブジェクトには反映されません。 コピーコンストラクタの一般的な形式は次のとおりです。

 クラス名(クラス名&オブジェクト名){。 //コピーコンストラクタの本体 // object_nameは、初期化の右側にあるオブジェクトを表します。 

プログラマがC ++プログラムでコピーコンストラクタを作成しない場合、コンパイラは暗黙的にコピーコンストラクタを提供します。 コンパイラによって提供される暗黙のコピーコンストラクタは、ソースオブジェクトのメンバーごとのコピーを行います。 ただし、オブジェクトにポインタ変数が含まれている可能性があるため、メンバー単位のコピーでは不十分な場合があります。 ポインタ変数をコピーするとは、ポインタ変数に格納されているアドレスをコピーすることを意味しますが、ポインタ変数に格納されているアドレスをコピーするのではなく、代わりにポインタが指すものをコピーします。 したがって、この種の問題を解決するには、プログラム内に明示的な 'コピーコンストラクタ'が必要です。

コピーコンストラクタは、次の3つの条件で呼び出されます。

  • コピーコンストラクタは、新しいオブジェクトが既存のオブジェクトで初期化されたときに呼び出されます。
  • 非参照パラメータとして関数に渡されたオブジェクト。
  • オブジェクトは関数から返されます。

例を挙げてコピーコンストラクタを理解しましょう。

クラスコピー{int num; public:copy(){} //デフォルトのコンストラクタcopy(int a){//コンストラクタの初期化num = a; } copy(copy&c){//コピーコンストラクタnum = c.num; void show(){cout << num;} ;}}; int main(){コピーA(200); //オブジェクトAが作成し初期化したコピーB(A); //コピーC = Aというコピーコンストラクタ //コピーDというコピーコンストラクタ D = A; //オブジェクトDが新しく作成されたオブジェクトではないため、//コピーコンストラクタは呼び出されない //代入操作です。 0を返します。 } 

上記のコードで、私はコンストラクタを明示的に "copy(copy&c)"と宣言しました。 このコピーコンストラクタは、オブジェクトBをオブジェクトAを使用して初期化するときに呼び出されます。オブジェクトCをオブジェクトAを使用して初期化するときは2回呼び出されます。それはすでに存在していて、新しく作成されたものではありません。 したがって、ここで代入演算子が呼び出されます。

代入演算子の定義

代入演算子はC ++の代入演算子です。 代入演算子を呼び出すには、「=」演算子を使用します。 あるオブジェクトのデータを別のオブジェクトと同じようにコピーします。 代入演算子は、あるオブジェクトを別のメンバーにコピーします。 代入演算子をオーバーロードしないと、ビット単位のコピーが実行されます。 したがって、代入演算子をオーバーロードする必要があります。

 クラスコピー{int num; public:copy(){} //デフォルトのコンストラクタcopy(int a){//コンストラクタの初期化num = a; void show(){cout << num;} ;}}; int main(){コピーA(200); //オブジェクトAが作成および初期化されたコピーB(300)。 //オブジェクトBが作成され初期化されたB = A; //代入演算子がコピーCを呼び出しました。 C = A; //代入演算子が呼び出した戻り値0 } 

上記のコードでは、objectAがobject Bに割り当てられているとき、両方のオブジェクトがすでに存在しているので、割り当て演算子が呼び出されています。 同様に、オブジェクトCがオブジェクトAで初期化される場合も同様です。

ビット単位の割り当てが実行されると、両方のオブジェクトが同じメモリ位置を共有し、あるオブジェクトの変更が別のオブジェクトに反映されます。

コピーコンストラクタと代入演算子の主な違い

  1. コピーコンストラクタは、代入演算子がビット演算子であるオーバーロードコンストラクタです。
  2. コピーコンストラクタを使用すると、既存のオブジェクトで新しいオブジェクトを初期化できます。 一方、代入演算子は、一方のオブジェクトをもう一方のオブジェクトにコピーします。どちらもすでに存在しています。
  3. コピーコンストラクタは、新しいオブジェクトが既存のオブジェクトで初期化されるとき、オブジェクトが参照以外のパラメータとして関数に渡されるとき、またはオブジェクトが関数から返されるときに初期化されます。 一方、代入演算子は、オブジェクトが別のオブジェクトに代入されているときにのみ呼び出されます。
  4. オブジェクトがコピーコンストラクタを使用して初期化されるとき、初期化オブジェクトと初期化されたオブジェクトは異なるメモリ位置を共有します。 一方、オブジェクトが代入演算子を使用して初期化されている場合、初期化されたオブジェクトと初期化されたオブジェクトは同じメモリ位置を共有します。
  5. コピーコンストラクタを明示的に定義しない場合は、コンパイラによって提供されます。 一方、代入演算子をオーバーロードしないと、ビット単位のコピー操作が実行されます。

結論:

コピーコンストラクタは、オブジェクトに生のポインタが含まれている場合に、あるオブジェクトを別のオブジェクトにコピーするのに最適です。

Top