8

次の構造体があるとします。

struct sampleData
{
       int x;
       int y;
};

sampleDataそして、使用するときは、タイプの変数を既知の状態に初期化したいと考えています。

sampleData sample = { 1, 2 } 

sampleData後で、次のように、構造体に追加のデータを格納する必要があると判断しました。

struct sampleData
{
       int x;
       int y;
       int z;
};

前のデータ構造から残された 2 つのフィールドの初期化は、zまだ有効なステートメントであり、コンパイルされることを理解しています。不足しているフィールドにデフォルト値を設定します。

この理解は正しいでしょうか?私は最近、集約の初期化も可能にする Ada で作業していますが、コンパイル エラーとして同様の問題にフラグを立てます。上記の C++ コードに関する私の仮定が正しいと仮定すると、不足している初期化値をエラーとして認識する言語構造はありますか?

4

4 に答える 4

5

このように変数を初期化することは、 Aggregate Classesでのみサポートされています。

コンストラクターを追加すると問題は解決しますが、構文を少し変更する必要がありstructunion(とりわけ) に格納する機能が失われます。

struct sampleData
{
    sampleData(int x, int y) : x(x), y(y) {}
    int x;
    int y;
};

sampleData sample( 1, 2 );

追加(およびコンストラクターの変更)すると、コンパイル エラーとしてzマークされます。sample( 1, 2 )

于 2011-06-08T20:06:34.210 に答える
4

C標準に関するNemoの回答のフォローアップとして、C++03標準の内容は次のとおりです。

§8.5.1/7:

リスト内の初期化子が集合内のメンバーよりも少ない場合、明示的に初期化されていない各メンバーは値で初期化されます。

§8.5/5:

タイプのオブジェクトを値で初期化Tするとは、次のことを意味します。

  • ユーザーが宣言したコンストラクターを持つクラス型の場合T、デフォルトのコンストラクターTが呼び出されます (アクセス可能なデフォルトのコンストラクターがない場合、初期化は整形式でTはありません)。
  • ユーザーが宣言したコンストラクターを持たない非共用体クラス型の場合T、すべての非静的データ メンバーと基本クラス コンポーネントTは値で初期化されます。
  • が配列型の場合T、各要素は値で初期化されます。
  • それ以外の場合、オブジェクトはゼロで初期化されます

タイプのオブジェクトをゼロで初期化Tするとは、次のことを意味します。

  • がスカラー型の場合T、オブジェクトは0(ゼロ) に変換された値に設定されTます。
  • T非共用体クラス型の場合、各非静的データ メンバーと各基本クラス サブオブジェクトはゼロで初期化されます。
  • Tが共用体型の場合、オブジェクトの最初の名前付きデータ メンバー) はゼロで初期化されます。
  • が配列型の場合T、各要素はゼロで初期化されます。
  • Tが参照型の場合、初期化は実行されません。
于 2011-06-08T20:15:16.843 に答える
4

はい、初期化リストから除外した要素はすべてゼロに初期化されるか (POD スカラー型の場合)、デフォルトのコンストラクターを使用して初期化されます (クラスの場合)。

C標準からの関連言語はここに引用されています:

[6.7.8.21] 集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が配列内の要素よりも少ない場合、集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。

C++仕様の1つで対応する言語を見つけることができたよりも、誰かがもっとやる気があると確信しています...

これは、「= 0」と書いたかのように POD スカラー要素が初期化されることを意味することに注意してください。つまり、表現がたまたますべてゼロのバイトでなくても、ポインタを NULL に正しく初期化し、浮動小数点数を 0.0 に正しく初期化します。また、再帰的に機能することも意味します。構造体に構造体が含まれている場合、内部構造体も適切に初期化されます。

于 2011-06-08T20:05:18.937 に答える
-2

使わない理由

sampleData sample = { x: 1, y:2 } ;

?

しかしz、予測不可能な値に初期化されるという問題が依然として発生するため、すべての変数を適切に定義された値に設定するコンストラクターを定義することをお勧めします。

于 2011-06-08T20:08:27.593 に答える