3

私の C++ Primer 第 5 版では、デフォルトの初期化について 43 ページで次のように述べています (強調は私のものです)。

明示的に初期化されていない組み込み型のオブジェクトの値は、定義されている場所によって異なります。関数本体の外側で定義された変数はゼロに初期化されます。

後で、73 ページで、次のような新しいクラスを定義します。

struct Sales_data {
  std::string bookNo;
  unsigned units_sold = 0;
  double revenue = 0.0;
};

これは、新しい標準のクラス内初期化子の例を提供することになっています。この場合、units_soldandrevenueはゼロに初期化されます。そうでない場合、変数はデフォルトで初期化されると彼らは言います。

しかし、これは私の質問です: このクラス内初期化のポイントは何ですか? それらをデフォルトで初期化することの何が問題になっていますか? 私が尋ねる理由は、関数本体の外側で定義された変数はゼロに初期化されるとすでに述べているためです。この場合、これらの変数は関数内ではなく、クラス定義にあります。したがって、デフォルトの初期化では、これらの変数をゼロに初期化する必要がありますね。

4

2 に答える 2

2

引用は間違った文脈にあるようです。変数は、少なくとも 3 つの状態を持つことができます。

  1. Default initialized : 変数は、引数または引数なしに基づいて、コンストラクター内で初期化されます。初期化された値は、このタイプの特殊なケースです
  2. In-class initialized : コードで提示した C++11 機能
  3. Uninitialized : 変数の初期化はどこにもアドレス指定されておらず、ガベージ値を含むことができます。一部のコンパイラは、自動的に作成し0たり、警告を表示したりする場合があります
于 2012-11-17T13:37:51.123 に答える
1

「関数本体の外側で定義された変数」に関する最初のステートメントは、静的リンケージを持つオブジェクト、つまり名前空間で宣言された変数を参照しています。これらはゼロ初期化されています。のメンバーは、structこれが存在する場所で初期化されstructます。スタック上にある場合、またはヒープ上に割り当てられている場合、組み込み変数は割り当てなしでは初期化されません。たとえば、次のように使用すると、次のようになります。

void f() {
    Sales_data data;
}

ただし、宣言で初期化がなくても、次のstructように使用するとゼロ初期化されます。

Sales_data global; // <--- the "outside any function body" case
void f() {
    Sales_data data0 = {};
    Sales_data data1 = Sales_data();
    Sales_data data2{};
}

ただし、これらはすべて のユーザーによる協力が必要であり、structそれらを明示的に初期化すると、値が確実に設定されます。

于 2012-11-17T13:36:54.107 に答える