【发布时间】:2016-09-06 02:01:36
【问题描述】:
我相信任何未初始化的东西都会自动初始化,这有点危险(而且实践不佳)。我也知道初始化列表通常更有效(在某些情况下是必要的),但是,我想通过函数调用验证一些参数,然后再将它们分配给成员变量。
例如,使用典型的赋值构造函数,我会有这样的东西:
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);
}
}
【问题讨论】:
-
没有必要为任何东西指定初始化。正如您所说,如果您不指定,那么成员将是默认构造的,在许多情况下这很好。如果需要,您可以通过在第二个代码块中调用成员函数来初始化初始化器列表中的一些成员和构造函数主体中的其余成员。
-
“我知道……”后面似乎总是有错误的陈述
-
@M.M:“我认为......”可能会更好
-
如果
verifyType失败,您对diffObj_的计划是什么?diffObj有自己的默认构造函数吗? -
@ChrisStathis:在大括号中包含一个列表和其余部分在语法上是否正确?
标签: c++ constructor initialization