メンバーの初期化
どちらの場合も、メンバーの初期化について話しています。メンバーは、クラスで宣言された順序で初期化されることに注意してください。
コード 2: メンバー初期化子リスト
2 番目のバージョンでは:
Test() : count(10) {
: count(10)
コンストラクター初期化子 ( ctor-initializer ) でcount(10)
あり、メンバー初期化子リストの一部としてのメンバー初期化子です。私はこれを初期化が行われる「実際の」または主要な方法と考えたいのですが、初期化の順序を決定するものではありません。
コード 1: デフォルトのメンバー初期化子
最初のバージョンでは:
private:
int count=10;
count
デフォルトのメンバー initializerがあります。これはフォールバック オプションです。コンストラクターに存在しない場合はメンバー初期化子として使用されますが、クラスでは初期化のためのメンバーのシーケンスが決定されます。
セクション12.6.2 Initializing bases and members, item 10 of the standard:
特定の非静的データ メンバーにブレースまたは等号初期化子と mem-初期化子の両方がある場合、mem-initializer によって指定された初期化が実行され、非静的データ メンバーのブレースまたは等号初期化子が実行されます。無視されます。【例:与えられた
struct A {
int i = / some integer expression with side effects / ;
A(int arg) : i(arg) { }
// ...
};
A(int) コンストラクターは単に i を arg の値に初期化し、i のブレースまたはイコイニシャライザーの副作用は発生しません。—終わりの例]
非静的データ メンバー初期化子を導入すると、構造体は C++11 では集合体と見なされなくなりますが、これはC++14 用に更新されています。
違い
あるフォームではなく他のフォームを使用することの違いは何ですか (もしあれば)。
- 違いは、2 つのオプションに与えられる優先順位です。直接指定されたコンストラクタ初期化子が優先されます。どちらの場合も、異なるパスを介してメンバー初期化子になります。
- デフォルトのメンバー初期化子を使用するのが最善です。
- 次に、コンパイラはその情報を使用してコンストラクタの初期化子リストを生成し、最適化できる可能性があります。
- すべてのデフォルトを 1 か所で順番に見ることができます。
- 重複を減らします。その後、手動で指定されたメンバー初期化子リストに例外を入れることしかできませんでした。