2017-01-27 11 views
2

私のコードを何度も簡素化した後、私は次のような問題を発見しました。会員初期化リストの順

class B { 
public: 
    B(const int x) 
       :_x(x) {} 
    const int _x; 
}; 

class C { 
public: 
    C(const B& b) 
     : _b(b), _b2(_b._x) {} 
    B _b2;  // line 1 
    const B& _b; // line 2 
}; 

int main() { 
    B b(1); 
    C c(b); 
} 

警告(打ち鳴らす8.0.0)

test16.cpp:11:22: warning: reference '_b' is not yet bound to a value when used here [-Wuninitialized] 
     : _b(b), _b2(_b._x) {} 
        ^
1 warning generated. 

グラム++ - 図6は、プログラムをコンパイル。プログラムを実行すると、セグメント化エラーが発生します。

クラスのメンバーの初期化は、メンバー初期化リスト(: _b(b), _b2(_b._x))の順番またはクラス内のメンバーの順番(たとえばB _b2; const B& _b;)に従っていますか?

+0

を初期化され、_b2は、パブリックメンバーと_bましたプライベートメンバーだった。私は通常プライベートセクションの前に公開セクションを書く... –

答えて

4

メンバ変数の初期化は、クラスで宣言されている順序で行われます。

http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-order

と:

http://en.cppreference.com/w/cpp/language/initializer_list

3)次に、非静的データメンバは、クラス定義の 宣言の順序で初期化されます。

+0

受け入れる答えを選択するのは難しい。私はisocppを信頼します。だから私は最後にこれを選ぶ。 –

+0

@rxu私はwww.cppreference.comを仕事や研究に幅広く使用しています。それはブックマークに値する。 –

3

member initializer listに指定する順序は関係ありません。非静的メンバーは、クラス定義の宣言の順番で初期化されます。

リストのメンバ初期化子の順序は無関係である:以下のように初期の実際の順序は、

3)次に、非静的データメンバは、クラス定義内の宣言の順序で初期化されます。

つまり、_b2は、常に_bより前に初期化されます。 を初期化するために_bが使用されても、まだ初期化されていません。

BTW:同様の規則が、直接基底クラスの初期化に適用されます。彼らはこのクラスのベース指定子のリストに表示されるように私はコードを単純化する前に

2)次に、直接基底クラスは左から右の順に

+0

私にはまだ問題が発生するという点は2)持っている運がなかった。しかし、今これを知ることはとても良いことです。 –

関連する問題