4

C ++で構造体をゼロに初期化する方法について大量のテストを行い、この回答を書いた後(注:それに対する反対票は、それを完全に書き直すでした)、なぜ= {0}すべてのメンバーを設定しないのか理解できません構造体をゼロに!

これを行う場合:

struct data_t
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
};

data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
       d3.num1, d3.num2, d3.num3, d3.num4);

...出力は次のとおりです。

d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150

...出力は次のようになると予想していましたが:

d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0

...これは、FIRST メンバーのみがゼロに設定され、残りはすべてデフォルトに設定されたことを意味します。

私は常に、これら 3 つの方法のいずれかで構造体を初期化するとゼロ初期化されるという印象を受けていましたが、明らかに間違っています。

  1. data_t d{}
  2. data_t d = {}
  3. data_t d = {0}

したがって、この回答からの私の重要なポイントは次のとおりです。

ここで重要なことはdata_t d{}、 、data_t d = {}、およびdata_t d = {0}のどれも実際には構造体のすべてのメンバーをゼロに設定しないということです。

  1. data_t d{}すべての値を構造体で定義されたデフォルトに設定します。
  2. data_t d = {}また、すべての値をデフォルトに設定します。
  3. data_t d = {0}FIRST 値のみをゼロに設定し、他のすべての値をデフォルトに設定します。

= {0}では、C++ 構造体を初期化してすべてのメンバーを 0に設定しないのはなぜでしょうか?

上記の重要なポイントは、実際には、私が何年も使用してきたこのかなり公式に見えるドキュメント ( https://en.cppreference.com/w/cpp/language/zero_initialization ) と矛盾していることT t = {} ;に注意してください。T {} ;実際、私のテストと上記の要点によると、初期化子はそうではありません。

参考文献:

  1. C++ で構造体を 0 に初期化する方法
  2. 更新: このリファレンスも指摘されました:オブジェクトを初期化するときの {0} の意味は何ですか?
4

3 に答える 3

2

簡単な答え: クラス内の初期化子があるためです。

より長い答え: C++14 以降用にコンパイルしているため、クラス内初期化子があり、集計初期化を使用しています。参照は説明を提供します:

初期化子句の数がメンバーの数よりも少ない場合、または初期化子リストが完全に空の場合、残りのメンバーは、クラス定義で提供されている場合はデフォルトのメンバー初期化子によって初期化され、そうでない場合 (C++14 以降) 空のリストによって初期化されます。 、通常のリスト初期化規則に従って (デフォルト コンストラクターを使用して非クラス型および非集約クラスの値の初期化を実行し、集約の集約初期化を実行します)。

すべてのデータ メンバーをゼロで初期化するには、クラス内初期化子を使用せずにデータ メンバー宣言のみを指定してから、= {0}or={}構文を使用します。

struct data_t
{
    int num1;
    int num2;
    int num3;
    int num4;
};

int main()
{
    data_t d3 = { 0 };
    printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
        d3.num1, d3.num2, d3.num3, d3.num4);
}

これで、すべてのデータ メンバーが に初期化され0ます。

于 2020-04-30T20:54:53.953 に答える