是的,你可以,而且你总是应该,通过构造函数初始化列表:
class Monitor
{
Person p;
bool state;
const int n;
double & d;
Monitor(std::string const & pname, double & dbl)
: p(pname)
, state(false)
, n(some_other_function(p, state))
, d(dbl)
{
// constructor body should be as short as possible
}
// ...
};
如您所见,初始化不仅仅是一个噱头;相反,它是 C++ 类型系统的一个深刻的必要性:有很多变量必须被初始化并且不能被赋值,例如常量和引用,还有没有默认构造函数的用户定义类型。 (即使有 个默认构造函数,您也需要一个赋值运算符,而且在任何情况下构造一个您不想稍后再覆盖它的东西仍然是一种浪费。)
还要注意你的类成分的构造顺序:当你创建你的类的一个新实例时,首先构造成员对象,按照它们在类定义中声明的顺序,但是按照初始化列表中的指定进行初始化。所有成员构造完成后,构造函数的body运行。
实际上,在成员对象之前还构造了另一件事:基础子对象。自然地,它们的初始化器也在初始化器列表中:
struct Foo { Foo(int, bool); /* ... */ };
struct Bar { Bar(std::string const &, int) /* ... */ };
class Monitor : public Foo, private Bar
{
Person p;
Monitor(std::string const & pname, int a, int b)
: Foo(a, a == b)
, Bar(pname, b)
, p(pname)
{
// constructor body
}
// ...
};
强烈建议(尽管不强制)在构造函数初始化器列表中按照它们的执行顺序编写初始化器!