更新: 技術的には、各メンバーの後に' = 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つのオプションについて考えています:
class MyClass
{
int a;
int b;
int c;
MyClass(int a)
{
this->a = a;
// now b and c have indeterminate values, what to do? (before setting 'a')
// option #1
*this = MyClass{}; // we lost the ability to do this since it requires default c-tor which is inhibited by declaring this c-tor; even if we declare one (private), it needs to explicitly zero members one-by-one
// option #2
std::memset(this, 0, sizeof(*this)); // ugly C call, only works for PODs (which require, among other things, a default c-tor defaulted on first declaration)
// option #3
// don't declare this c-tor, but instead use the "named constructor idiom"/factory below
}
static MyClass create(int a)
{
MyClass obj{}; // will zero-initialize since there are no c-tors
obj.a = a;
return obj;
}
};
私の推論は正しいですか?3つの選択肢のうちどれを選びますか?