ここではいくつかの例を示します。
これは、このオブジェクトのデータメンバーを異なる順序で初期化する必要がある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_
または、データメンバーがthisオブジェクトへの参照を必要とし、コンストラクターの本体を開始する{の前にthisキーワードを使用することについてのコンパイラー警告を回避したい場合(特定のコンパイラーがその特定の警告を発行した場合)。
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つを初期化する前に、変数(パラメーター、グローバルなど)に対してif/throwテストを実行する必要がある場合。
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つのデータメンバーが自己参照の場合
ですから、その例をあげることはできません。