以前我有:
MyClass::MyClass() : myMember(VALUE,this,5,"etc.") { ... }
但是我需要对传递给myMember的构造函数的值进行一些计算。我如何在构造函数体内初始化
myMember
?我不确定是否应该这样做:MyMember myMember(calculatedValue,this,5,"etc.");
最佳答案
所有成员初始化都在构造函数主体运行之前发生。因此,如果您这样做:
MyClass::MyClass()
{
myMember = MyMember(calculatedValue,this,5,"etc.");
}
这将是分配,而不是初始化。因此,如果
MyMember
是不可分配的(例如,它们具有私有(private)分配运算符),它将无法正常工作。如果将myMember
声明为const
,它也将不起作用。但是,您可以执行以下操作:
class MyClass {
public:
MyClass() : myMember(calculate(VALUE),this,5,"etc.") {}
private:
static int calculate(int x) { return x*3; }
};
甚至是这样的:
class MyClass {
public:
MyClass() : myMember(createMember()) {}
private:
static MyMember createMember(int x) {
MyMember m;
m.foo = 5;
...
return m;
}
};
请注意,我在这里使用了
static
辅助函数,因为在通常情况下,在构造函数完成之前使用非static
成员函数会有些奇怪。