以前我有:

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成员函数会有些奇怪。

10-07 16:38