3
#include <iostream>

using namespace std;

struct A {
    // Some Other Code
    int x;
};

A a1;

int main(){
    A a2;
    cout << "a1.x = " << a1.x << endl;
    cout << "a2.x = " << a2.x << endl;
    return 0;
}

C++14 標準 (ISO/IEC 14882:2014) セクション 8.5、パラグラフ 12:

オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。自動または動的ストレージ期間を持つオブジェクトのストレージが取得されると、オブジェクトの値は不定になり、オブジェクトの初期化が実行されない場合、そのオブジェクトはその値が置き換えられるまで不定値を保持します (5.17)。[ 注: 静的またはスレッド ストレージ期間を持つオブジェクトはゼロで初期化されます。3.6.2 を参照してください。- 終了注記】

a1静的ストレージ期間がa2あり、自動ストレージ期間がありますか? の定義は宣言Struct Aと同様にグローバル名前空間にありますが、宣言はブロック スコープ (関数内) にあります。a1a2main()

また、セクション 3.6.2 は次のように述べています。

段落1:

静的記憶域期間を持つ非ローカル変数は、プログラムの開始の結果として初期化されます。

パラグラフ 2:

静的保存期間 (3.7.1) またはスレッド保存期間 (3.7.2) を持つ変数は、他の初期化が行われる前にゼロで初期化されます (8.5)。

その上、gcc 5.4.0 では警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]) とランダムな値が表示されますが、clang 3.8.0 では常に出力されますa2.x = 0(ゼロは不確定な値になることもあります)。structまた、ネストされたとデフォルトの初期化を に配置して、他のより複雑な実験も行いました// Some Other Code。ランダムな値を取得することもあれば、ゼロを取得することもあります (無視できる数ではありません)。

  • Struct の保存期間はA? そして、オブジェクトa1a2?そして、変数a1.xa2.x

  • ゼロa1.xa2.x初期化する必要がありますか? それとも不定値ですか?

  • と に同じ規則が適用されclassますunionか?

  • のコードに違いはあります// Some Other Codeか?たとえば、クラス T が「デフォルトの初期化子を持つ非静的メンバを持つ」( のようにstruct A { int b = 1; int x; };) 場合、デフォルトのコンストラクタは自明ではありません (つまり、アクションを実行できません)。その重要なコンストラクターも初期化しxますか? 自明なデフォルト コンストラクタ

興味深いリンク:

C++ 構造体の初期化

構造体のデフォルト値の初期化

C++ 構造体のメンバーはデフォルトで 0 に初期化されていますか?

C++ での POD 型のデフォルトの初期化

C と C++ での静的ストレージ期間を使用したオブジェクトの初期化

C および C++ : 自動構造体の部分的な初期化

構造体を全要素ゼロまたはヌルに初期化する方法

4

2 に答える 2

5

a1 には静的ストレージ期間があり、a2 には自動ストレージ期間がありますか?

Struct の定義はAグローバル名前空間にあります ...

これは無関係です。

...グローバル名前空間とa1宣言にあります

a1静的ストレージ期間があり、ゼロで初期化されています。

whilea2宣言はブロックスコープにあります

a2非静的ブロック ローカル変数です。自動保存期間があり、デフォルトで初期化されています。不定値です。


Struct の保存期間はA?

型には保存期間がありません。オブジェクトはそうです。

...そして、オブジェクトa1a2?

上記を参照。

.. そして、変数a1.xa2.x?

非静的データ メンバーを含むサブオブジェクトは、そのスーパーオブジェクトの有効期間を継承します。

...ゼロa1.xa2.x初期化する必要がありますか? それとも不定値ですか?

a1ゼロ初期化されています。これには、そのサブオブジェクトが含まれます。a2ではありません。これには、そのサブオブジェクトが含まれます。

同じ規則がクラスとユニオンに適用されますか?

ストレージ クラスに関しては、同じ規則セットがユニオン クラスと非ユニオン クラスのオブジェクト、および非クラス タイプに適用されます。デフォルトの初期化が意味するものは、型によって異なります。

// Some Other Code のコードに違いはありますか? たとえば、クラス T のコンストラクターが「デフォルトの初期化子を持つ非静的メンバーを持つ」場合、デフォルトのコンストラクターは自明ではありません (つまり、アクションを実行しません)。

コンパイラの既定値によって生成される重要な既定のコンストラクターは、既定の初期化子を持たないメンバーを初期化します。

于 2017-01-11T16:41:48.887 に答える
2

構造体 A の保存期間は?

この質問は意味がありません。ストレージAは使用方法によって異なります。


そして、オブジェクトa1とa2のそれは?

a1静的ストレージがあります。詳細については、この質問を参照してください。

a2自動収納があります。


そして、変数 a1.x と a2.x のそれは?

Aインスタンスと同じ方法で格納されます。


同じ規則がクラスとユニオンに適用されますか?

はい。

于 2017-01-11T16:41:28.250 に答える