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

I want to move something out of an initialisation list, how should I do it?

本文关键字:移出 我应该 列表 初始化      更新时间:2023-10-16

以前我有:

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

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

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

所有成员初始化都发生在构造函数主体运行之前。所以如果你这样做:

MyClass::MyClass()
{
    myMember = MyMember(calculatedValue,this,5,"etc.");
}

这将是分配,而不是初始化。因此,如果MyMember不可赋值(例如,它们有一个私有赋值运算符),它就不起作用。如果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成员函数在一般情况下会有点奇怪。

如果在MyClass的构造函数内分配myMember成员,那么实际上是在调用MyMember的默认构造函数,然后调用赋值运算符。

如果它对你来说很好,那么你只需要写:

MyClass::MyClass()
{
    myMember = MyMember(calculatedValue,this,5,"etc.");
}

否则,您需要一种不同的方法。