C ++構文:コピーコンストラクタ(ディープコピー浅いコピー)

コピーにオブジェクトを初期化します

オブジェクトはコンストラクタを呼び出します初期化し、異なる初期化メソッドは、異なるコンストラクタを呼び出します。

  • オブジェクトは、その後、一般的なコンストラクタを呼び出して、渡された引数で初期化されている場合は、我々としてもこの共通の初期化を呼ぶかもしれません。
  • (既存のオブジェクト)データが他のオブジェクトとオブジェクトを初期化する場合は、コピーコンストラクタを呼び出すのコピーが初期化されます。

 

単純なクラスの場合、デフォルトのコピーコンストラクタは、一般的に十分使用することです、我々は明示的にコピーコンストラクタと同様の機能を定義する必要はありません。しかし、メモリなどの他のリソースを保持しながら、クラスを動的に割り当てられたときに、他のデータへのポインタのポインタとデフォルトのコピーコンストラクタは、これらのリソースをコピーすることはできません、と明示的にコピーコンストラクタ、オブジェクトの完全なコピーを定義する必要があります、のようなすべてのデータ。


一緒にコピーして他のリソースが保持しているようなオブジェクトは、深いコピーと呼ばれ、我々は明示的に深いコピーの目的を達成するためのコピーコンストラクタを定義する必要があります。

=演算子のオーバーロード

::&アレイ配列演算子(= constのアレイ&ARR){   // オーバーロードされた代入演算子
    IFこの {=&ARR!)   // 自分に割り当てられたと判断された場合は
        、この - > m_len = arr.m_lenを、
         無料この - > M_P );   // 元のメモリを解放し
        、この - > M_P =(INT *)のcallocこれ - > m_len、はsizeofINT )); 
        のmemcpy(これ - > M_P、arr.m_p、m_len * はsizeofINT )); 
    } 
    リターン * この; 
}

*これを返すべき理由について:

次のように説明しました:

プログラミングを簡単にするために、時々次のような、一連を割り当てる必要があり:X = Y = Z = 15、右の使用は割当を結合するので、上記の文は次のように解釈されるように、X =(Y =(Z = 15))。

シリーズの割り当てを達成するために、次のように、代入演算子は、左引数のオペレータへの参照を返す必要があります。

1クラスウィジェット
 2 { 
 3公共:
 4 ... 
 5ウィジェット&演算子=(CONSTウィジェット&RHS)
 6 { 
 7 ... 
 8リターン*この; 
 9} 
10 ... 
11}。

 

注意:

このルールは適用されないだけ割り当てに=、他の演算子は=、+好き - =なども同様に適用可能です。

あなたがクラスを定義するとき、我々は、明示的または暗黙的にコピーし、割り当てとどのような破壊されたときに行うには、このタイプのオブジェクトを指定します。これら3回の特別な操作で定義されたクラスのメンバー関数によって制御されるコピーコンストラクタ代入演算子デストラクタ

おすすめ

転載: www.cnblogs.com/icehole/p/12121838.html