以前我曾经:
MyClass::MyClass() : myMember(VALUE,this,5,"etc.") { ... }
但我需要对传递给myMember构造函数的值进行一些计算。如何在构造函数体中初始化myMember
?我不确定我是否应该这样做:
MyMember myMember(calculatedValue,this,5,"etc.");
答案 0 :(得分:6)
所有成员初始化都在构造函数体运行之前发生。所以如果你这样做了:
MyClass::MyClass()
{
myMember = MyMember(calculatedValue,this,5,"etc.");
}
这将是分配,而不是初始化。因此,如果MyMember
s不可分配(例如,它们具有私有赋值运算符),则无效。如果将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
成员函数在一般情况下会变得有点奇怪。
答案 1 :(得分:0)
如果在myMember
'构造函数中分配MyClass
成员,则实际上是调用MyMember
的默认结构函数,然后调用赋值运算符。
如果对你没问题,那么你只需要写:
MyClass::MyClass()
{
myMember = MyMember(calculatedValue,this,5,"etc.");
}
否则,您需要采用不同的方法。