C++primer第13章ノート初稿
13.1コピー、割り当て、破棄コピーコンストラクタ 定義:コンストラクション関数であり、最初のパラメータは自己クラスタイプの参照であり、任意の追加パラメータにはデフォルト値があります. 他のコンストラクション関数が定義されている場合でも、コンパイラは作成中のオブジェクトに1つずつコピーするようにコピーコンストラクション関数を合成します. 発生状況: =演算子で変数 を定義する非参照の実パラメータ をパラメータに渡すは、非参照タイプのオブジェクト を返す.カッコリスト配列または集約クラス を初期化 explicit制限は初期化方式に大きな影響を及ぼす.
注意:コンテナ操作では、insertまたはpushがコピーを初期化し、emplaceが直接初期化します.
コピー割付演算子 コンパイラは、コピー付与演算子を合成します. 合成コピー演算子は、そのタイプのオブジェクトに値を割り当てることを禁止する場合があります.
構造関数 合成構造関数は、このタイプのオブジェクトが破棄されるのを阻止するために使用される場合がある. 構造関数自体は、クラスのメンバーを直接破棄しません.
defaultとdelete default:コンパイラに合成バージョンを生成するように要求(暗黙的にインラインと宣言) delete:宣言されたが使用できない(デフォルトで合成された場合は不合理) 構造関数が削除された場合、これらのオブジェクトは定義できませんが、動的に割り当てることができます. クラスのあるメンバーの構造関数が削除またはprivateである場合、そのクラスの合成コピー構造関数は削除される. クラスのメンバーにconstまたは参照メンバーがある場合、クラスのコピー付与演算子は削除されます. クラスのメンバーの構造関数が削除またはprivateである場合、またはconstメンバーがあり、そのメンバーにクラス内の初期化器がない場合、または定義されたデフォルト構造関数が表示されない場合、クラスのデフォルト構造関数は削除されます. クラスのメンバーの一部が削除された場合、そのクラスの対応する部分も削除されます. の違い:defaultは最初の宣言ではない場所に表示されますが、deleteはできません.同時に、delete として宣言することができます.
13.2コピー制御と資源管理
コピー操作を定義するときに、クラス値をコピーするかクラスポインタをコピーするかを考慮するのは、良い角度です.クラス値動作
注意:通常、付与演算子はコピー構造関数と構造関数の操作を統合し、カスタム付与は自己付与の問題を効果的に解決する必要があります.
クラスポインタ動作注意:shared_ptr代替 13.3交換一般クラスのswap操作はinlineと宣言される. 賦値演算でswapと値で伝達する方法は、非常に安全である.
13.4オブジェクトの移動右参照 フラグ:&& 性質: は、破棄するオブジェクトにバインドされている(論理的に破棄される、すなわち再使用されない) .右値参照を右値参照タイプの変数 にバインドすることはできません.
右値参照を左値にバインドする方法 強制タイプ変換 move関数 を呼び出す
の移動操作は、移動後のソースオブジェクトの値を「盗んだ」のと同じように、「空のシェル」にします.
noexcept 意味:異常を投げ出さないことを約束する. では、コンパイルを分離する場合は、ヘッダファイルと定義を明記する必要があります.
移動操作の注意点 パラメータは右参照(くだらない話) です.移動後、ソースオブジェクトが無害であることを保証しなければならない の移動は不可逆的な である.賦値において、自己賦値の場合は と事前に判断する.
モバイルコンストラクタ コンパイラは、現在のクラスにコピー制御メンバーがなく、データメンバーが静的でない場合にのみ、移動構造関数を合成します. は、default()命令を用いてコンパイラに移動構造関数の生成を要求するが、生成要求を満たさない場合にのみ、移動関数を削除として定義する.
モバイル反復器 の意味:一般的な反復器の逆参照演算子の動作を変更する 操作:make_move_interator
参照修飾子 の役割:右の値がこの関数 を呼び出すことを阻止する方式:パラメータリスト後加&限定子 性質:リロードバージョン(const限定子と同様) を区別できる.
注意:コンテナ操作では、insertまたはpushがコピーを初期化し、emplaceが直接初期化します.
13.2コピー制御と資源管理
コピー操作を定義するときに、クラス値をコピーするかクラスポインタをコピーするかを考慮するのは、良い角度です.
注意:通常、付与演算子はコピー構造関数と構造関数の操作を統合し、カスタム付与は自己付与の問題を効果的に解決する必要があります.
A &operator = (A ra){
swap (*this, ra);
return *this;
}
13.4オブジェクトの移動