3

いくつかの double 値を持つ構造体があります。

struct A {
  double a;
  double b;
}

たとえば、新しい構造体を作成すると、A aすべてのメンバー (たとえば、a.a) は C++ で自動的にゼロに初期化されますか?

4

3 に答える 3

11

デフォルトではありません (静的ストレージの変数、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) {}
};
于 2013-06-14T10:30:04.910 に答える
7

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
于 2013-06-14T10:29:15.320 に答える
3

いいえ。一般的なケースでは、未指定の値があります。

この動作が気に入らない場合は、コンストラクターを提供できます。

struct A {
  double a;
  double b;

  A(): a(0.0), b(0.0) {}
}
于 2013-06-14T10:28:36.433 に答える