C++初期化関数リスト詳細解析

2264 ワード

初期化メンバーのリストは、次の3つの場合に使用します.
一、初期化が必要なデータメンバーがオブジェクトである場合.
二、const修飾のクラスメンバーを初期化する必要がある.
三、参照メンバーデータを初期化する必要がある.
理由:C++は参照タイプのメンバー変数を定義し、参照タイプのメンバー変数はコンストラクション関数の初期化リストで初期化する必要があります.クラスメンバーがconst修飾である場合、または参照タイプである場合、付与操作は許可されません(明らかにconstは誤って付与されることを防止し、参照タイプは付与を定義する必要があります).そのため、初期化リストの整列でのみ初期化できます.メンバー・タイプは、デフォルトのコンストラクション関数がないクラスです.初期化式が表示されていない場合、コンパイラはメンバータイプのデフォルトコンストラクタを暗黙的に使用し、クラスにデフォルトコンストラクタがない場合、コンパイラがデフォルトコンストラクタを使用しようとすると失敗します.(つまりこの3つの場合は初期化リストを使用する必要があります)
次のPersonクラスを定義します.
 
  
class Person {

public:

  Person() { } //default constructor function

  Person(string name, string phone, string addr)

  {

    m_name = name; //

    m_phone = phone;

    m_addr = addr;

  }

private:

  const string m_name;

  const string m_phone;

  const string m_addr;

};


コンパイル後,このクラスの2番目のバンドパラメータの構造関数が間違っていることが分かった.Personオブジェクトを作成します.
Person p("marcky", "13233232", "cqupt");//パラメータ付きコンストラクション関数を呼び出してPersonオブジェクトを作成するプロセスは、次の2つのステップに分けられます.
一、メモリから実際の空間をオブジェクトpに割り当て、その3つの文字列オブジェクトのデータメンバーが呼び出したデフォルト構造関数を空に初期化する.すなわち,この時点で,オブジェクトpの3つのデータメンバはいずれも空の文字列である.
二、呼び出したコンストラクション関数の関数体文を実行し、データメンバーへの付与を完了し、空のオブジェクトではなく指定Personオブジェクトを作成することを期待します.
上記の第2のステップから,3つのconstオブジェクトに対して付与操作を行っていることが明らかに許されない操作であるため,この構造関数を用いてPersonを作成することは失敗に終わる.特定のPersonオブジェクトを正常に作成するには、関数初期化リストを構築する必要があります.
Person(string name, string phone, string addr):m_name(name), m_phone(phone), m_addr(addr){}//コロン開始定義初期化リスト初期化リストを使用してオブジェクトを作成するコンストラクション関数は、オブジェクトのデータ・メンバーを作成する際にデフォルトのコンストラクション関数ではなく、指定したパラメータに基づいて対応するコンストラクション関数を呼び出し、空のオブジェクトではなく特定のオブジェクトを作成する点で、上記の2つのステップで完了します.これにより、オブジェクトのデータ・メンバーの特定の値は、オブジェクトの作成時に対応するメンバーに付与され、オブジェクトの作成が完了した後に付与文でデータ・メンバーを変更するのではなく、コンストラクション関数を使用してリストを初期化することでconstデータ・メンバーを持つオブジェクトの作成に成功します.
デフォルトコンストラクション関数のないクラスタイプのメンバーが、初期化リストで初期化されていない場合、そのオブジェクトを作成するときに、対応する「実パラメータ」が指定されていないため、コンパイラはデフォルトコンストラクション関数を呼び出してオブジェクトを作成し、必ず失敗に終わります.
注意1:データ・メンバーが初期化される順序は、コンストラクション関数の初期化リストの順序に関係なく、メンバーの定義順序と一致します.
注意2:初期化リストの使用は効率的です.コンストラクション関数で値を割り当てるとコピーになります.初期化リストであれば初期化になります.もちろん、値と初期化は効率的ではありません.