私は初期化されていないものは自動的に初期化され、これはやや危険です(そして練習が悪い)と思います。また、初期化リストは一般的に効率的(場合によっては必要)であることも理解していますが、メンバ変数に割り当てる前に、関数呼び出しでいくつかのパラメータを検証したかったのです。私は初期化リストを利用することができるか、しかしこのような状況にコンストラクタ内のすべてを初期化する必要がありますか?
class MyObj
{
private:
int one_;
int two_;
DiffObj diffObj_;
... // other stuff
}
MyObj::MyObj(int a, int b, std::string type, std::vector<double> params)
{
one_ = a;
two_ = b;
if (verifyType(type, params))
{
diffObj_ = createDiffObj(params);
}
}
:たとえば
、典型的な割り当てコンストラクタを使用して、私はこのような何かを持っているだろうか?私はおそらくコンストラクタのいくつかのパラメータを初期化し、残りの部分を初期化するために別々の呼び出しを使用することによって考えましたが、それが正当なものかどうかはわかりません。
MyObj::MyObj(int a, int b) :
one_(a),
two_(b)
{}
MyObj::initializeDiffObj(std::string type, std::vector<double> params)
{
if (verifyType(type, params))
{
diffObj_ = createDiffObj(params);
}
}
何かの初期化を指定することは必須ではありません。あなたが言うように、指定しなければ、メンバーはデフォルトで構築されます。多くの場合、これはうまくいきます。必要に応じて、2番目のコードブロックのメンバ関数を呼び出すことによって、initializer-listの中のいくつかのメンバとコンストラクタの本体の残りのメンバを初期化することができます。 – Chris
"私はそれを知っています..."常に偽の声明が続いているようです –
@ M.M: "考えました..."と言った方が良いかもしれません – marcman