ブレース初期化割り当てが変数をガベージで埋めるのはなぜですか?

Code_So1dier

ブレースの初期化を使用すると、変数にはデフォルト値が割り当てられるという考えに陥りました。しかし、私は間違っていました。

次の例では:

#include <string>
#include <iostream>

#include <stdint.h>


class A
{
public:
    A() {}
    ~A(){}

    int var1;
    int32_t var2;
    int64_t var3;
    std::string var4;
    double var5;
    float var6;

    std::string info() const {
        return "var1=" + std::to_string(var1) + " " +
               "var2=" + std::to_string(var2) + " " +
               "var3=" + std::to_string(var3) + " " +
               "var4=" + var4 + " " +
               "var5=" + std::to_string(var5) + " " +
               "var6=" + std::to_string(var6) + " " +
               "\n"
               ;
    }
};

int main()
{
    A a;
    std::cout << "Before assigning variables: " << a.info();

    a.var1 = 1;
    a.var2 = 2;
    a.var3 = 3;
    a.var4 = "4";
    a.var5 = 5;
    a.var6 = 6;
    std::cout << "After assigning variables: " << a.info();

    a = {};
    std::cout << "After brace init assignment: " << a.info();
}

結果は次のとおりです。

Before assigning variables: var1=0 var2=0 var3=4198240 var4= var5=0.000000 var6=0.000000 
After assigning variables: var1=1 var2=2 var3=3 var4=4 var5=5.000000 var6=6.000000 
After brace init assignment: var1=2114725200 var2=32766 var3=4199416 var4= var5=0.000000 var6=0.000000

それを修正するには:

  1. デフォルトのコンストラクターを取り除くと、問題は解決します。
  2. クラスのメンバー変数が中括弧で初期化されている場合、0またはデフォルト値が割り当てられます。例えば:

    class A
    {
    public:
        A() {}
        ~A(){}
    
        int var1{};
        int32_t var2{};
        int64_t var3{};
        std::string var4{};
        double var5{};
        float var6{};
    };
    

誰かがこれが起こる理由を説明できますか?ここで何が欠けていますか?

ソンユアンヤオ

a = {};は割り当てであり、aから構築された一時オブジェクトから割り当てられます{}暗黙的に生成された割り当ては、すべてのデータメンバーに対してメンバーごとの割り当てを実行し{}ます。ポイントは、一時オブジェクトがから初期化される方法です。

これはコピーリストの初期です。効果として、値の初期化が実行されます。

それ以外の場合、braced-init-listが空で、Tがデフォルトのコンストラクターを持つクラス型である場合、値の初期化が実行されます。

値の初期化の効果として

1)Tがデフォルトコンストラクターのないクラスタイプであるか、ユーザー提供または削除されたデフォルトコンストラクターの場合、オブジェクトはデフォルトで初期化されます。

Aにはユーザー提供のデフォルトコンストラクタがあり、デフォルトの初期化の効果として、そのデフォルトのコンストラクタが一時オブジェクトの初期化に使用されます。ユーザー提供のデフォルトコンストラクタの体が空で、その後、一時的なオブジェクトに対して、var4しますデフォルト初期化std::stringのデフォルトコンストラクタ、ビルドインタイプを持つ他のすべてのデータメンバーは不定値になります。

  1. デフォルトのコンストラクターを取り除くと、問題は解決します。

次に、値の初期化の動作が次のように変わります。

(私の強調)

2)Tが、ユーザー提供も削除もされていないデフォルトコンストラクターを持つクラスタイプである場合(つまり、暗黙的に定義された、またはデフォルトのデフォルトコンストラクターを持つクラスである可能性があります)、オブジェクトはゼロで初期化され、その後、default-重要なデフォルトコンストラクターがある場合は初期化されます。

ここでの違いに注意してください。一時オブジェクトは最初はゼロで初期化されます。次に、組み込みタイプのすべてのデータメンバーがに初期化されます0var4まだデフォルトで初期化されています)。

  1. クラスのメンバー変数が中括弧で初期化されている場合、0またはデフォルト値に割り当てられます。

これは、デフォルトの初期化子リストがどのように機能するかです

デフォルトのメンバー初期化子を使用します。これは、メンバー宣言に含まれる中括弧または等しい初期化子であり、メンバーがメンバー初期化子リストで省略されている場合に使用されます。

次に、すべてのデータメンバーが指定された初期化子によって初期化されます。あなたのサンプルでは、彼らがすべてだ値に初期化が、効果として、var4あるデフォルトの初期化、他のメンバーがされ、ゼロに初期化します0

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

初期化されていない変数がガベージ値を出力しないのはなぜですか?

分類Dev

初期化されていない変数に「nil」ではなくガベージが含まれているのはなぜですか?

分類Dev

ユーザーが値を割り当てる前に、この変数を初期化する必要があるのはなぜですか?

分類Dev

Observable内でブール変数を割り当てることができないのはなぜですか?

分類Dev

Default()割り当てを使用してDelphiでレコード変数を初期化するのは安全ですか?

分類Dev

Default()割り当てを使用してDelphiでレコード変数を初期化するのは安全ですか?

分類Dev

関数リテラルで変数にプレースホルダーを割り当てることができないのはなぜですか?

分類Dev

スタックからメモリを割り当て解除した後でも、出力がガベージではないのはなぜですか?

分類Dev

GCCが0に初期化されたときに静的変数を割り当てないのはなぜですか

分類Dev

派生クラス変数を初期化し、その基本クラスタイプに割り当てると、そのメンバーへのアクセスが許可されないのはなぜですか?

分類Dev

gcc逆アセンブラがローカル変数に余分なスペースを割り当てるのはなぜですか?

分類Dev

Cが初期化されていないローカル変数を許可するのはなぜですか?

分類Dev

なぜこの変数にスペースを割り当てるのですか?

分類Dev

このカプセル化の例でプライベート変数が2回割り当てられるのはなぜですか?

分類Dev

TypeScriptがオブジェクトプロパティの割り当てをオブジェクトキーとして使用し、変数の割り当てを関数の引数として使用するのはなぜですか?

分類Dev

変数の各フィールドを割り当てたのに、コンパイラが初期化されていない変数について警告するのはなぜですか?

分類Dev

ラムダ実行でレイジー変数を初期化する必要がないのはいつですか?

分類Dev

WAN IPがパブリックではなくプライベートIPアドレスとして割り当てられるのはなぜですか?

分類Dev

同じ値を割り当てるとサブスクライブハンドラーがトリガーされるのはなぜですか?

分類Dev

JavaScript:戻り関数を変数に割り当てた場合にのみ、クロージャーが発生するのはなぜですか?

分類Dev

ガベージコレクションを強制すると、Javaプロセスに割り当てられるメモリが増えるのはなぜですか?

分類Dev

変数がないのにメインがスタックフレームを初期化するのはなぜですか

分類Dev

埋め込まれたArrayList <Integer>をローカルで宣言されたArrayList <Integer>に割り当てることができないのはなぜですか?

分類Dev

Rubyで初期化されていないインスタンス変数がnilを返すのに、初期化されていないクラス変数でエラーが発生するのはなぜですか?

分類Dev

このデータフレーム変数が、明示的に割り当てられていない属性を取得するのはなぜですか?(dplyr-R)

分類Dev

スコープリークにつながるいくつかの変数の初期化はなぜですか?

分類Dev

ブロックスコープで複数の割り当てと初期化を行う方法はありますか?

分類Dev

ExecuteReader()が文字列をトレーススペースで埋めるのはなぜですか?

分類Dev

ビュープロパティを変数に割り当てる必要があるのはなぜですか?

Related 関連記事

  1. 1

    初期化されていない変数がガベージ値を出力しないのはなぜですか?

  2. 2

    初期化されていない変数に「nil」ではなくガベージが含まれているのはなぜですか?

  3. 3

    ユーザーが値を割り当てる前に、この変数を初期化する必要があるのはなぜですか?

  4. 4

    Observable内でブール変数を割り当てることができないのはなぜですか?

  5. 5

    Default()割り当てを使用してDelphiでレコード変数を初期化するのは安全ですか?

  6. 6

    Default()割り当てを使用してDelphiでレコード変数を初期化するのは安全ですか?

  7. 7

    関数リテラルで変数にプレースホルダーを割り当てることができないのはなぜですか?

  8. 8

    スタックからメモリを割り当て解除した後でも、出力がガベージではないのはなぜですか?

  9. 9

    GCCが0に初期化されたときに静的変数を割り当てないのはなぜですか

  10. 10

    派生クラス変数を初期化し、その基本クラスタイプに割り当てると、そのメンバーへのアクセスが許可されないのはなぜですか?

  11. 11

    gcc逆アセンブラがローカル変数に余分なスペースを割り当てるのはなぜですか?

  12. 12

    Cが初期化されていないローカル変数を許可するのはなぜですか?

  13. 13

    なぜこの変数にスペースを割り当てるのですか?

  14. 14

    このカプセル化の例でプライベート変数が2回割り当てられるのはなぜですか?

  15. 15

    TypeScriptがオブジェクトプロパティの割り当てをオブジェクトキーとして使用し、変数の割り当てを関数の引数として使用するのはなぜですか?

  16. 16

    変数の各フィールドを割り当てたのに、コンパイラが初期化されていない変数について警告するのはなぜですか?

  17. 17

    ラムダ実行でレイジー変数を初期化する必要がないのはいつですか?

  18. 18

    WAN IPがパブリックではなくプライベートIPアドレスとして割り当てられるのはなぜですか?

  19. 19

    同じ値を割り当てるとサブスクライブハンドラーがトリガーされるのはなぜですか?

  20. 20

    JavaScript:戻り関数を変数に割り当てた場合にのみ、クロージャーが発生するのはなぜですか?

  21. 21

    ガベージコレクションを強制すると、Javaプロセスに割り当てられるメモリが増えるのはなぜですか?

  22. 22

    変数がないのにメインがスタックフレームを初期化するのはなぜですか

  23. 23

    埋め込まれたArrayList <Integer>をローカルで宣言されたArrayList <Integer>に割り当てることができないのはなぜですか?

  24. 24

    Rubyで初期化されていないインスタンス変数がnilを返すのに、初期化されていないクラス変数でエラーが発生するのはなぜですか?

  25. 25

    このデータフレーム変数が、明示的に割り当てられていない属性を取得するのはなぜですか?(dplyr-R)

  26. 26

    スコープリークにつながるいくつかの変数の初期化はなぜですか?

  27. 27

    ブロックスコープで複数の割り当てと初期化を行う方法はありますか?

  28. 28

    ExecuteReader()が文字列をトレーススペースで埋めるのはなぜですか?

  29. 29

    ビュープロパティを変数に割り当てる必要があるのはなぜですか?

ホットタグ

アーカイブ