問題タブ [value-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - リスト初期化で集約型を値初期化する方法
リスト初期化構文を使用してC++ 14で集約型を値初期化するにはどうすればよいですか?
これは集合体の初期化と見なされ、 の初期化されていないメンバーに対してエラーまたは警告が生成されますAggregate_t
。
これはまったく可能ですか?
編集:例
g++-4.9.2 でコンパイル:
c++11 - オブジェクトがゼロで初期化されていることを確認する方法は?
更新: 技術的には、各メンバーの後に' = 0
' または ' 'を追加するのを忘れる可能性があるため、クラス全体を一度にゼロ初期化する方法があるかどうかを確認しています。{}
コメントの 1 つは、明示的にデフォルト設定された引数なしの c-tor は、フォームの値の初期化中にゼロ初期化を有効にするMyClass c{};
ことを述べています。http://en.cppreference.com/w/cpp/language/value_initializationを見ると、どのステートメントがこれを指定しているかわかりません。
C++11 ではさまざまな初期化構造の意味と構文が変更されたため、初期化は現在複雑なトピックです。他の質問から十分な情報を収集できませんでした。ただし、たとえば、デフォルトのコンストラクターを書くとゼロ初期化が強制されますか?を参照してください。.
私が直面している具体的な問題は次のとおりです。(1) デフォルトの c-tor を宣言するクラスと、(2) そうでないクラスの両方で、自分のクラスのメンバーが確実にゼロになるようにしたいのです。
(2){}
の場合、値の初期化の構文であり、ゼロ初期化に変換されるか、クラスが集合体の場合は集合体の初期化に変換されるため、初期化はジョブを実行します-初期化子が提供されなかったメンバーの場合(すべて! ) はゼロで初期化されます。
しかし、(1)については、何が最善のアプローチになるのかまだわかりません。私が収集したすべての情報から、デフォルトのc-torを提供する場合(たとえば、メンバーの一部をいくつかの値に設定する場合)、残りのメンバーを明示的にゼロにする必要があることを学びました。そうしないと、構文MyClass c = MyClass();
またはC ++ 11MyClass c{};
が機能しません. 言い換えれば、この場合の値の初期化は、単に c-tor を呼び出すことを意味し、それだけです (ゼロ化はありません)。
値を取り、それらの値をメンバーのサブセットに設定するc-torを宣言すると、同じ状況に遭遇しますが、他のメンバーをゼロに設定したい場合:それを行うための省略形はありません-I 3つのオプションについて考えています:
私の推論は正しいですか?3つの選択肢のうちどれを選びますか?
c++ - プリミティブ データ型はループ内で何回割り当てられますか?
次に例を示します。
j はプリミティブ データ型で、k はオブジェクトです。Do built-in types have default constructors? によると、、
そのため、非クラス型 (基本型、配列型、参照型、ポインター型、および列挙型を含む) にはコンストラクターがありません。
Declaring Variables inside Loops によれば、良い習慣か悪い習慣か? (2人) ,
オブジェクト (std::string など) の場合は、反復ごとにコンストラクターとデストラクターを実行する必要があります。
ただし、while ループ内の変数宣言 C/C++は、
main()
関数が (オペレーティング システムなどによって) 呼び出されると、すべてのローカル変数が関数の開始時に作成され、関数の終了時に破棄されることを学びました。上記の while ループの引用は、プリミティブ データ型i
が while ループ ブロックで宣言されたときに作成され、各反復の while ループ ブロックの最後で破棄されることを示しています。
これは本当ですか?#1 while ループ ブロック内でプリミティブ データ型が宣言されており、while ループの反復ごとに割り当てられていますか。#2 while ループ内のこれらの宣言は、while ループ ブロックが含まれている関数の開始時に作成する必要があると仮定するのは間違っていますか?
はいまたはいいえだけでなく、詳細な説明を探しています。
c++ - 直接初期化と値の初期化
私は C++11 を学ぼうとしている C プログラマーですが、理解できない問題に遭遇しました。私が知る限り、次の問題は値の初期化と直接の初期化の違いです。
次のコード スニペットは、Visual Studio を使用してコンパイルされません。
それは私に与えます:
エラー C2797: 'TestClass::_msg': メンバー初期化子リスト内のリスト初期化または非静的データ メンバー初期化子が実装されていません
ただし、変更
に
私の問題を修正します。これら 2 つの初期化形式の違いは何ですか?また、どちらを使用する必要がある場合は? 明示的な型を扱うときは常に値の初期化を使用する必要があると信じるようになりました。
c++ - POD 構造体の値の初期化は constexpr ですか?
構造体を考えてみましょう:
これは常に有効であるというのは本当ですか:
つまり、POD の値の初期化はconstexpr
? 同様に、構造体が次のように定義されている場合はどうですか。
最後に、これはどうですか:
ctr を constexpr として宣言していませんが、これを保証する暗黙の控除規則はありますか?
c++ - ゼロ初期化、静的初期化、および値初期化はどのように異なりますか?
Ben Voigtはここで次のように指摘しています。
ゼロ初期化は、静的初期化のステップの 1 つです。しかし、ゼロの初期化は値の初期化でも実行されるため、後者 (タグ) をやみくもに置き換えることはできません。ただし、タグは静的初期化と値初期化の両方に既に存在し、それらはより関連性があるため、C++ のコンテキストでは (タグという名前の) ゼロ初期化は必要ありません。
「Static-Initializing」や「Value-Initializing 」ではなく「Zero-Initialize」が理にかなっている場合、または「Zero-Initialization」が実際に発生することは決してない場合があり、より具体的に使用する必要があると思いました「静的初期化」または「値初期化」のような用語?
公平を期すために、これらのトピックに関する私の経験のほとんどは、この質問への回答を研究することから得られているため、Ben Voigt が正しいと確信しています。誰かに理由を説明してもらいたいだけです。