初期化子

initializer.png

基本

コンストラクタの後に : <変数名>(<初期値>) と書けば、その変数を「初期化」できる。
メンバ変数が配列の場合は <変数名>{要素1,要素2,,,} と書けばその変数を初期化できる

CMiffy::CMiffy(int _i):mMiffy(_i){}

これをメンバ初期化子リストという。
 コンストラクタ初期化子は、コンストラクタの関数名(通常「シグネイチャー」と呼びます)と実装部の間にコロンを挟んで置かれます。複数ある場合にはカンマで継なぎます。

実行される順番

初期化子リストは、そのクラス自身のコンストラクタが実行されるよりも前に呼び出される。
さらに

初期設定リストに並べられた順番ではなく、
クラス内で宣言された順番で呼び出される。

初期化子でしか値を設定できないもの

  1. constなメンバ変数 const int m_x;
  2. リファレンスなメンバ CMiffy& m_miffy;
  3. デフォルトコンストラクタを持たないクラスのオブジェクトメンバ CMiffy m_miffy;

メンバである配列の中身を初期化したい時。

//Class.hに
//int mArray[3];がメンバにあったとする
 
//Class.cpp
Class()
:mArray{1,2,3}{
}

疑問

初期化子に渡す前に値のチェックをしたい場合は初期化子にかかないで、コンストラクタ内で代入してもいいの????
たとえば、const unsigned char なメンバがあって、
ユーザが間違えて256とか、255以上の数を渡したら、思ったような値にはならない。
だから、255いないかチェックしたい。
そしたら、いったんは初期化しで初期化しといて引数をチェックしてやればいい。
エラーだったらassertしてやれ。

初期化子を使わない方がよい場合

組み込み型のデータメンバが数多く存在し、それらすべてを、どのコンストラクタでも同じように初期化したい場合。
組み込み型オブジェクトでは、初期化と代入に大差はない。
たとえば、こんなかんじなら効率的

void CMiffy::init(){//この関数はprivateにする。
a=b=c=d=e=f=g=h=0;
}

オーバーロード参照。

constructor

サポートサイト Wikidot.com constructor