class
では、メンバーはリストされている順に初期化されています。それはpublic
とprivate
などに変数のグループ化に適用されますか?私の混乱は、private
のメンバーが、クラス宣言の中でプライベート変数がどこに記載されているかにかかわらず、メンバーがpublic
の前にリストされている順番で初期化されるような好みがあるかどうかわからないということですクラス初期化C++クラスメンバー初期化シーケンス
2
A
答えて
3
規則は[class.base.init非委任コンストラクタ内/ 11
に綴られる)基本クラスのメンバーに向かって存在し、次の順序で初期化が進行する:
最初に、最も派生したクラス(1.8)のコンストラクタに対してのみ、仮想基底クラスは、基底クラスの有向非循環グラフの深さ優先の左から右への走査に現れる順序で初期化されます。 「左から右へ」は、派生クラスbase-specifier-listにおける基本クラスの出現順序である。
次に、直接基底クラスは、(mem-initializerの順序にかかわらず)base-specifier-listに現れるように、宣言順に初期化されます。
次に、非静的データメンバは、クラス定義で宣言された順番で(mem-initializerの順序にかかわらず)初期化されます。
8最後に、コンストラクタ本体の複合文が実行されます。
[注:宣言の順序は、基本オブジェクトとメンバのサブオブジェクトが初期化の逆の順序で確実に破棄されるようにするために必要です。私たちは弾丸3を見ると末端ノート]
強調鉱山
だから、それを具体的にメンバーがインクルードは、定義に現れる順序で構築されていると述べています。これは、private
、public
に関係なく、またはそれらがクラスメンバー初期化リストにどのようにリストされているかを、宣言された順序で構成することを意味します。
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]
関連する問題
- 1. クラスメンバーの初期化C++
- 2. 初期化関数で静的クラスメンバーを初期化する
- 3. constクラスメンバーをデフォルト値で初期化
- 4. Java:オブジェクトの初期化シーケンス
- 5. ネストされたコンストラクタによるクラスメンバーのC++初期化
- 6. (C#)クラスメンバー初期化するスレッドの安全性の問題
- 7. C++ - 静的クラスメンバーの初期化と変更
- 8. 初期化リストを介してコンストラクタ内のクラスメンバー(ベクトル)を初期化する
- 9. MSVC2015は初期化されていないクラスメンバーを初期化する
- 10. CNTKシーケンス2シーケンスチュートリアル:placeholder_variableの初期化
- 11. C++初期化クラスメンバー変数は他のメンバ変数に依存します
- 12. Boost.Fusionシーケンスの要素を別のシーケンスから初期化する
- 13. C#初期化オブジェクト
- 14. C++リファレンス初期化
- 15. C++ローカル初期化?
- 16. 初期化(C#)と
- 17. C++の初期化
- 18. VECTOR初期化C++
- 19. 初期化のないクラスメンバー変数としての参照
- 20. は、私は、データ構造を持つクラスメンバー初期化子リストで
- 21. C++ 11値初期化前に集約し、初期化する
- 22. C++ 11の値の初期化子とリストの初期化子
- 23. んC#コレクション初期化構文は、デフォルトの初期化オーバーヘッドに
- 24. ペアの初期化のC++ベクトル初期化 - コンパイルエラー
- 25. 初期化C++のstruct
- 26. C++ Sudokouグリッドの初期化
- 27. Cの初期化は、ポインタ
- 28. Cでメモリアロケータを初期化
- 29. C++ 11クラス初期化エラー
- 30. C配列の初期化
をバイアスは、基本コンストラクタが派生する前に呼び出され、順序を強制することです。アクセス修飾子は順序に影響しません。しかし、あなたは正式な言語弁護士証拠を持つことを望むかもしれません。非公式に、内部の動作についての直感を得るために、コンストラクタから名前を表示する少数のサンプルクラスを作成し、そのようなタイプのメンバーを異なるアクセス修飾子の下に置いて遊ぶことができます。 – Drop