は、いくつかの例は以下のとおりです。
クラスが に必要な2つのコンストラクタは異なる順序で、このオブジェクトのデータメンバを初期化していたときにこれが発生する可能性があります。この例では
class Example1 {
public:
Example1(std::string decoded, std::string encoded)
: decoded_(decoded),
encoded_(encoded) {}
explicit Example1(std::string encoded)
: decoded_(), // Can't use "decoded_(Decode())" since "encoded_" isn't initialised
encoded_(encoded) {
decoded_ = Decode(); // Assign here instead of initialising
}
private:
std::string Decode(); // decodes class member "encoded_"
std::string decoded_, encoded_;
};
それは、彼らが我々が初期化リストで自分の順番を入れ替えた場合でも、クラスで宣言された順番だから、decoded_
は常にencoded_
前に初期化されます。
場合、またはデータ・メンバーは、このオブジェクトへの参照を必要とし、あなたが前 にこのキーワードの使用方法についてのコンパイラの警告を避けたい {それは(コンストラクタの体を開始しますあなたの特定の コンパイラがその特定の警告を発行したとき)。ここで
class Example2 {
public:
Example2() : functor_() {
functor_ = std::bind(&Example2::Do, this);
}
private:
void Do();
std::function<void()> functor_;
};
、functor_
は、それが割り当てられて/初期化されるときthis
を使用する必要があります。初期化リストにfunctor_
を初期化する場合、this
ポインタは、その時点で完全に初期化されていないオブジェクトを参照することになります。それは特定の状況に応じて安全ですが、絶対確実なオプションは、コンストラクタ本体の内部まで設定functor_
を延期することです。this
はは完全に初期化されたオブジェクトを参照します。
それとも、以前ご このメンバーの1を初期化するために、その変数を使用している場合/変数のテストを投げる(パラメータ、 グローバルなど)を行う必要があります。
class Example3 {
public:
Example3(int force, int acceleration)
: force_(force),
acceleration_(acceleration),
mass_(0) {
if (acceleration_ == 0)
throw std::exception("Can't divide by 0");
mass_ = force_/acceleration_;
}
private:
int force_, acceleration_, mass_;
};
うまくいけば、これは自明です。
私は、2人のデータメンバーが自己参照
ので、私は、私は怖いそのために例を与えることはできませんされたときに
が何を意味するかわかりません。
初期設定の順序はオプションではありません。初期設定ステートメントを書く順番に関係なく同じです。 –
あなた自身の質問に対する回答をリストし、サンプルを求めているようですか?どうして?あなたは何を理解していないのですか? –
質問を編集してその声明の著者を追加できますか?言い換えれば、どこからその声明を取ったのですか? – nbro