我想从初始化列表中移出一些东西,我应该怎么做?

时间:2012-01-24 09:40:36

标签: c++ initialization

以前我曾经:

MyClass::MyClass() : myMember(VALUE,this,5,"etc.") { ... }

但我需要对传递给myMember构造函数的值进行一些计算。如何在构造函数体中初始化myMember?我不确定我是否应该这样做:

MyMember myMember(calculatedValue,this,5,"etc.");

2 个答案:

答案 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.");
}

否则,您需要采用不同的方法。