2016-11-16 16 views
2

classでは、メンバーはリストされている順に初期化されています。それはpublicprivateなどに変数のグループ化に適用されますか?私の混乱は、privateのメンバーが、クラス宣言の中でプライベート変数がどこに記載されているかにかかわらず、メンバーがpublicの前にリストされている順番で初期化されるような好みがあるかどうかわからないということですクラス初期化C++クラスメンバー初期化シーケンス

+0

をバイアスは、基本コンストラクタが派生する前に呼び出され、順序を強制することです。アクセス修飾子は順序に影響しません。しかし、あなたは正式な言語弁護士証拠を持つことを望むかもしれません。非公式に、内部の動作についての直感を得るために、コンストラクタから名前を表示する少数のサンプルクラスを作成し、そのようなタイプのメンバーを異なるアクセス修飾子の下に置いて遊ぶことができます。 – Drop

答えて

3

規則は[class.base.init非委任コンストラクタ内/ 11

に綴られる)基本クラスのメンバーに向かって存在し、次の順序で初期化が進行する:

  • 最初に、最も派生したクラス(1.8)のコンストラクタに対してのみ、仮想基底クラスは、基底クラスの有向非循環グラフの深さ優先の左から右への走査に現れる順序で初期化されます。 「左から右へ」は、派生クラスbase-specifier-listにおける基本クラスの出現順序である。

  • 次に、直接基底クラスは、(mem-initializerの順序にかかわらず)base-specifier-listに現れるように、宣言順に初期化されます。

  • 次に、非静的データメンバは、クラス定義で宣言された順番で(mem-initializerの順序にかかわらず)初期化されます。

8最後に、コンストラクタ本体の複合文が実行されます。

[注:宣言の順序は、基本オブジェクトとメンバのサブオブジェクトが初期化の逆の順序で確実に破棄されるようにするために必要です。私たちは弾丸3を見ると末端ノート]

強調鉱山

だから、それを具体的にメンバーがインクルードは、定義に現れる順序で構築されていると述べています。これは、privatepublicに関係なく、またはそれらがクラスメンバー初期化リストにどのようにリストされているかを、宣言された順序で構成することを意味します。

1

非静的データメンバーは、宣言された順に初期化されます。あなたが有効に警告を持っている場合は、これをテストすることができ、次のコードをコンパイルして

// Example program 
#include <iostream> 
#include <string> 

class Test { 

private: 
    int a; 

public: 
    int b; 

    Test() : a(0), b(0) {} 

}; 

class TestPrivatePriority { 

public: 
    int b; 

    TestPrivatePriority() : a(0), b(0) {} 

private: 
    int a; 

}; 

class TestPublicPriority { 

private: 
    int a; 

public: 
    int b; 

    TestPublicPriority() : b(0), a(0) {} 

}; 

int main() 
{ 
    Test t; 
    TestPrivatePriority t1; 
    TestPublicPriority t2; 

    return 0; 
} 

これは、次の自明の警告を生成します:それはありません、基本クラスの場合

In constructor 'TestPrivatePriority::TestPrivatePriority()': 
25:9: warning: 'TestPrivatePriority::a' will be initialized after [-Wreorder] 
20:9: warning: 'int TestPrivatePriority::b' [-Wreorder] 
22:5: warning: when initialized here [-Wreorder] 
In constructor 'TestPublicPriority::TestPublicPriority()': 
35:9: warning: 'TestPublicPriority::b' will be initialized after [-Wreorder] 
32:9: warning: 'int TestPublicPriority::a' [-Wreorder] 
37:5: warning: when initialized here [-Wreorder] 
関連する問題