ダイレクト初期化とコピー初期化

2655 ワード

定義:
  • 変数を等号(=)で初期化すると、実際には「コピー初期化」が実行され、コンパイラは等号の右側の初期値を新しく作成したオブジェクトにコピーします.
  • とは逆に、等号を使用しない場合は「直接初期化」
  • が実行される.
    例:
    string dots(10,'.');                //     
    string s(dots);                     //     
    string s2 = dots;                   //     
    string null_book = "9-999-99999-9"; //     
    string nines = string(100,'9');     //     

    注意:
  • 直接初期化は、実際には、コンパイラが通常の関数マッチングを使用して、我々が提供するパラメータと最も一致する構造関数
  • を選択することを要求する.
  • コピーの初期化は、実際にはコンパイラに右側の演算オブジェクトを作成中のオブジェクトにコピーするように要求するものであり、通常はコピーコンストラクタで
  • を完了する.
    コピー初期化の他の状況:
    コピー初期化は、=変数を定義する場合だけでなく、次の場合も発生します.
  • オブジェクトを実パラメータとして非参照タイプのパラメータに渡すとき
  • .
  • は、戻りタイプが非参照タイプである関数からオブジェクト
  • を返す.
  • 標準ライブラリコンテナの初期化またはそのinsertまたはpushメンバーの呼び出し(これに対してemplaceメンバーで作成する要素はすべて直接初期化)
  • .
    コピーコンストラクション関数のパラメータは、参照タイプの理由でなければなりません.
    参照タイプでない場合は、コピーコンストラクション関数を呼び出すには、その実パラメータをコピーする必要がありますが、実パラメータをコピーするには、コピーコンストラクション関数を呼び出す必要があります.このように無限にループし、エラーが発生します.
    コピー初期化の制限:
    コピーコンストラクタの前にexplicitキーが追加されている場合、コピーコンストラクタを呼び出すと暗黙的なタイプ変換はできませんが、表示タイプ変換は次のようにできます.
    vector<int> v1(10); //  :     
    vector<int> v2 = 10;//  :            explicit 
    void f(vector<int>);//f          
    f(10);//  :     explicit           
    f(vector<int>(10));//  :          (f           )

    参考:『C++Primer』