いくつかの double 値を持つ構造体があります。
struct A {
double a;
double b;
}
たとえば、新しい構造体を作成すると、A a
すべてのメンバー (たとえば、a.a
) は C++ で自動的にゼロに初期化されますか?
いくつかの double 値を持つ構造体があります。
struct A {
double a;
double b;
}
たとえば、新しい構造体を作成すると、A a
すべてのメンバー (たとえば、a.a
) は C++ で自動的にゼロに初期化されますか?
デフォルトではありません (静的ストレージの変数、static
つまりグローバル変数でない限り)。
この種の構造体を「ゼロ」に初期化するには、いくつかの方法があります。
A a = { 0.0, 0.0 };
A a = { };
A a = A();
または、C++11 互換コンパイラを使用している場合:
A a{0.0, 0.0};
A a{}
struct
またはコンストラクターを定義に追加します。
struct A {
double a;
double b;
A() : a(0.0), b(0.0) {}
};
8.5. 初期化子 [dcl.init] / 11 .
オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。初期化が実行されない場合、自動または動的ストレージ期間を持つオブジェクトの値は不確定です。[注:静的またはスレッド ストレージ期間を持つオブジェクトはゼロで初期化されます。3.6.2 を参照してください。—エンドノート]
および (読みやすくするために順序を逆にします):
8.5. 初期化子 [dcl.init] / 6 .
タイプ T のオブジェクトをデフォルトで初期化するとは、次のことを意味します。
— T が (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。
— T が配列型の場合、各要素はデフォルトで初期化されます。
—それ以外の場合、初期化は実行されません。 [鉱山を強調]
プログラムが const 修飾された型 T のオブジェクトの既定の初期化を呼び出す場合、T は、ユーザー提供の既定のコンストラクターを持つクラス型でなければなりません。
それらはデフォルトで初期化されています。int
またはのような組み込み型の場合double
、その値は構造体が宣言されている場所によって異なります(経験則として (ただし、それと同じです):初期化されない限り、それらは常にガベージであると仮定します)。
グローバル スコープまたはstatic
ストレージを使用する場合、それらはすべてゼロです (構造体がグローバル スコープにある構造体のメンバーである場合を含む)。
関数ローカル スコープでは、それらはガベージでいっぱいです。
例:
#include <iostream>
struct Foo {
int x;
int y;
};
Foo foo;
int main () {
Foo bar;
std::cout << foo.x << ":" << foo.y << '\n';
std::cout << bar.x << ":" << bar.y << '\n';
}
これは最初の実行で私に与えます
0:0
-1077978680:12574708
再コンパイルせずに 2 回目の実行を行うと、次のようになります。
0:0
-1075556168:12574708
POD 構造体は、egmemset
または ...を使用してすべてゼロに初期化できます。
Foo foo = {0}; // C and C++03
Foo foo{0}; // C++11
いいえ。一般的なケースでは、未指定の値があります。
この動作が気に入らない場合は、コンストラクターを提供できます。
struct A {
double a;
double b;
A(): a(0.0), b(0.0) {}
}