

メンバ変数が多いと初期化リストを書く場合に改行して縦に書きたい場合があります。  
その場合に初期化リストの書き方でどう書くのが良いか迷ったのでまとめてみました。  
それぞれの書き方についてのメリット、デメリットや別の書き方があれば教えてください。

※主にVS2013, 2015を使っているでそれを元にした意見になっています。  
※1タブ4スペースを前提に書いています。

## No.1

  * コロンの位置が人によっては違和感を覚える？
  * インデントがそろっているのでVisualStudioのコード整形がきく。  

[code]

    class test_class
    {
        test_class():
            a(),
            b(),
            c()
        {}
    
        int a, b, c;
    };
    
[/code]

## No.2

  * カンマが行のはじめに来ているのであまり見慣れない？
  * インデントがそろっているのでVisualStudioのコード整形がきく。  

[code]

    class test_class
    {
        test_class()
            : a()
            , b()
            , c()
        {}
    
        int a, b, c;
    };
    
[/code]

## No.3

  * 1つ目以降の変数のインデントがずれているのでコード整形を使うとずれてしまう。  

[code]

    class test_class
    {
        test_class()
            : a(),
              b(),
              c()
        {}
    
        int a, b, c;
    };
    
[/code]


CC BY-SA 3.0
2015-09-20T14:49:19.053
16802
2016-02-01T03:21:33.807
11012
question
c++
コンストラクタの初期化リストのコーディングスタイル


私は下記の記述が良いと考えています。

[code]

    class test_class
    {
        int a = 0;
        int b = 0;
        int c = 0;
    };
    
[/code]

：を使った初期化子は実行順序が見た目と異なる可能性があり、余計なバグを生む可能性があります。

[code]

    class test_class
    {
        // 問題なさそうに見えるがa以外不定値
        test_class():
            a(),
            b(a),
            c(b)
        {}
    
        // cの初期化、bの初期化、aの初期化の順番で初期化される
        int c, b, a;
    };
    
[/code]

また、メンバ変数が多い場合初期化忘れがあり得ますが、こちらの記述で全て初期化しておくというルールにしておけば初期化忘れはまず防げると思います。

もし、コンパイラファイアウォールや動的メモリ確保の問題でこの記述を使いたくなった場合でも

[code]

    test_class()
    {
        foo = new Foo();
        bar = new Bar(foo);
    }
    
    Foo *foo = nullptr;
    Bar *bar = nullptr;
    
[/code]

の様にコンストラクタ初期化子を使わない記述の方が分かりにくいバグを生みにくいと思います。


CC BY-SA 3.0
2015-10-04T00:40:19.813
17236
2015-10-04T00:40:19.813
12554
16802
answer