メンバ変数は初期化リストで初期化する

メンバ変数をコンストラクタ内で初期化をすると

class Test{
public:
  Test(){
    test_ = "test";
  }

private:
  std::string test_;
}

オブジェクトtest_はデフォルトコンストラクタで初期化された後、代入演算子で値が設定されることになり非効率である。
初期化リストを用いて実装すると

class Test{
public:
  Test()
  : test_("test")
  {
  }
private:
  std::string test_;
}

コピーコンストラクタが呼び出されるだけなので効率的になることが多い。

また、変数の初期化順についても規定されており

  • 派生クラスより先に基底クラスが初期化される
  • 「初期化リストの順番」ではなく「データメンバの宣言順」で初期化される

となっている。初期化リストの順番とデータメンバの宣言順が異なっていてもコンパイルエラーにならず初期化順に依存したわかりづらいバグにつながる。このため、初期化リストの順番はデータメンバの宣言順と揃えておくべきである。

参考文献

Effective C++ 第3版, スコット・メイヤーズ著

スポンサーリンク







シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク