c+11でメンバ変数初期化のされ方

c+11で書いていてクラス内のメンバの中に、コンストラクタで初期化子が定義されてないものがあったのでどのような挙動になるのか調べてみた。

これらを見るとわかりやすい
C++11: Syntax and Feature
C++の初期化は分かりにくい - ぷろみん

まず、staticが付いたものなどglobalスコープの変数はゼロ初期化されてことが保証されている (不定にはならない)

それ以外だと、デフォルト初期化と値初期化の場合で挙動が異なる

デフォルト初期化の場合

以下のSのように初期化子のカッコを付けずにオブジェクトを生成した場合のこと クラスのメンバ変数に対し、コンストラクタでのメンバー初期化子が指定されてない場合もこれになる

int main() {
    S s;
    ...
}
  • メンバがクラス型である場合
    • デフォルトコンストラクタが呼ばれる
  • メンバが配列型である場合
    • 各要素がそれぞれデフォルト初期化
  • それ以外の場合

値初期化の場合

以下のSのように初期化子のカッコを付けて定義したもの 他にもnewをつけた場合やコンストラクタでのメンバー初期化子などもこれ

int main() {
    S s();
    ...
}
  • メンバがクラス型である場合
    • デフォルトコンストラクタが呼ばれる
  • メンバが配列型である場合
    • 各要素がそれぞれデフォルト初期化
  • それ以外の場合、
    • ユーザ定義コンストラクタを持つ場合
    • ユーザ定義コンストラクタを持たない場合
      • ゼロ初期化