C++ 通过将其他构造函数初始化的 class 成员分配给它们来初始化 class 成员是个坏主意吗?

C++ Is it a bad idea to initialise class members by assigning them other constructor initialised class members?

我发现了一种初始化 class 成员 q 的查询方法,方法是将其分配给通过构造函数 i 初始化的不同 class 成员:

class test{
public:
    test(int c) : i(c) {
    }

    int i;
    int q = i;
};

int main() {
    std::cout << test(1).q << std::endl; //outputs 1
}

但是,如果我交换 iq 的声明顺序:

int q = i;
int i;

打印出 i 输出 0。

以这种方式初始化 class 成员是个坏主意吗?很明显,在此示例中,将 : i(c), q(c) 添加到构造函数可能更容易。

但是对于 class 成员依赖 i 的情况,例如某些对象的构造函数采用 int (i) 并具有私有 = 运算符和复制构造函数,这种方法可能是初始化该对象的好方法吗?或者这是一个坏主意,应该始终避免?

是的,您已经概述了失败的条件。不难想象有人由于重新排序而无意中破坏了您的代码。

如果你想做这样的事情,最好在输入源的构造函数中分配两者。

test(int c) : q(c), i(c) {}

这减少了初始化顺序的混乱,并且两个变量不再相关。