是的,你可以,你总是应该,通过构造函数初始化列表:
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++类型系统的一个深刻的必要性:有很多变量,其中必须被初始化并且不能被赋值,比如常量和引用,还有用户定义的类型,没有默认构造函数。 (即使有为默认构造函数,那么你需要一个赋值操作符,它在任何情况下仍然是浪费构建你不想要的东西只是覆盖它片刻之后。)
收费还要注意类组成部分的构建顺序:创建类的新实例时,首先按照在类定义中声明它们的顺序构造成员对象,但按照初始化程序列表。在构建所有成员之后,运行构造函数的正文。
实际上,还有一件事是在成员对象之前构建的:base子对象。当然,他们的初始太无二在初始化列表中:
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
}
// ...
};
强烈建议(虽然不是强制),你写在构造函数初始化列表中初始化中,他们将执行相同的顺序!
我只能在Monitor构造函数中初始化它。 –
@ user1495181:做一个辅助函数,就像我为'n'做的那样! –