C++:コンストラクタのパターン

要約

オブジェクトのコンストラクタの書き方には2パターンある。

  • メンバ初期化子で書く
  • コンストラクタ本体の中に書く

両者の違いは、 メンバ初期化子で行うオブジェクト生成が初期化であり、コンストラクタ本体の中に書くものは代入と言う点。

解説

次のようなクラスがあるとする。

/* Account.h */
class Account {
  private:
    std::string full_name;
    std::string number;
  public:
    Account(std::string name, std::string num);
};

このクラスに対してコンストラクタを書く方法は、メンバ初期化子で書くパターンと、コンストラクタ本体の中で書くパターンがある。

/* Acount.cpp */
/* パターンA:メンバ初期化子で書く */
Account::Account(string name, string num) 
  : full_name(name), number(num)
{
}

/* パターンB:本体の中に書く */
Account::Account(string name, string num)
{
 full_name = name;
 number = num;
}

違いをまとめる。

パターン 違い
メンバ初期化子で書く オブジェクトを生成する段階で、コンストラクタの引数でメンバ変数を直接初期化する
本体の中に書く オブジェクトをデフォルトコンストラクタで生成した部分オブジェクトに対して、
コンストラクタの引数を既に生成された部分オブジェクトのメンバ変数に代入する

コンストラクタの動作のイメージとしては次のような感じになる。

  • メンバ初期化子で書く image.png

  • 本体の中に書く image

上の図の通り、コンストラクタ本体の場合、値の設定が2段階(オブジェクトの初期化、代入)となるため、コンストラクタ初期化子を用いる方がベター。

参考

柴田さんの本は、C言語のものもそうだけど、とてもわかりやすいですね😄