コピーにオブジェクトを初期化します
オブジェクトはコンストラクタを呼び出します初期化し、異なる初期化メソッドは、異なるコンストラクタを呼び出します。
- オブジェクトは、その後、一般的なコンストラクタを呼び出して、渡された引数で初期化されている場合は、我々としてもこの共通の初期化を呼ぶかもしれません。
- (既存のオブジェクト)データが他のオブジェクトとオブジェクトを初期化する場合は、コピーコンストラクタを呼び出すのコピーが初期化されます。
単純なクラスの場合、デフォルトのコピーコンストラクタは、一般的に十分使用することです、我々は明示的にコピーコンストラクタと同様の機能を定義する必要はありません。しかし、メモリなどの他のリソースを保持しながら、クラスを動的に割り当てられたときに、他のデータへのポインタのポインタとデフォルトのコピーコンストラクタは、これらのリソースをコピーすることはできません、と明示的にコピーコンストラクタ、オブジェクトの完全なコピーを定義する必要があります、のようなすべてのデータ。
一緒にコピーして他のリソースが保持しているようなオブジェクトは、深いコピーと呼ばれ、我々は明示的に深いコピーの目的を達成するためのコピーコンストラクタを定義する必要があります。
=演算子のオーバーロード
::&アレイ配列演算子(= constのアレイ&ARR){ // オーバーロードされた代入演算子 IF(この {=&ARR!) // 自分に割り当てられたと判断された場合は 、この - > m_len = arr.m_lenを、 無料(この - > M_P ); // 元のメモリを解放し 、この - > M_P =(INT *)のcalloc(これ - > m_len、はsizeof(INT )); のmemcpy(これ - > M_P、arr.m_p、m_len * はsizeof(INT )); } リターン * この; }
*これを返すべき理由について:
次のように説明しました:
プログラミングを簡単にするために、時々次のような、一連を割り当てる必要があり:X = Y = Z = 15、右の使用は割当を結合するので、上記の文は次のように解釈されるように、X =(Y =(Z = 15))。
シリーズの割り当てを達成するために、次のように、代入演算子は、左引数のオペレータへの参照を返す必要があります。
1クラスウィジェット 2 { 3公共: 4 ... 5ウィジェット&演算子=(CONSTウィジェット&RHS) 6 { 7 ... 8リターン*この; 9} 10 ... 11}。
注意:
このルールは適用されないだけ割り当てに=、他の演算子は=、+好き - =なども同様に適用可能です。
あなたがクラスを定義するとき、我々は、明示的または暗黙的にコピーし、割り当てとどのような破壊されたときに行うには、このタイプのオブジェクトを指定します。これら3回の特別な操作で定義されたクラスのメンバー関数によって制御されるコピーコンストラクタ、代入演算子とデストラクタ。