【发布时间】:2021-09-16 20:15:46
【问题描述】:
我发现了一种初始化类成员 q 的查询方法,方法是将其分配给通过构造函数 i 初始化的不同类成员:
class test{
public:
test(int c) : i(c) {
}
int i;
int q = i;
};
int main() {
std::cout << test(1).q << std::endl; //outputs 1
}
但是,如果我交换 i 和 q 的声明顺序:
int q = i;
int i;
打印出i 输出0。
以这种方式初始化类成员是不是一个坏主意?显然,在这个例子中,将: i(c), q(c) 添加到构造函数中可能更容易。
但是对于存在依赖i 的类成员的情况,例如某些对象的构造函数采用int (i) 并具有私有= 运算符和复制构造函数,这种方法可能是初始化该对象的好方法吗?或者这是一个坏主意,应该始终避免?
【问题讨论】:
-
成员按照定义的顺序进行初始化。即使你在成员初始化列表中
: q(c), i(c),如果i先定义,i会先初始化。没有例外。它们也会以相反的顺序被销毁,没有例外,所以你有可靠的行为保证。 -
是的,这是个坏主意。如您所见,只需有人移动变量的顺序,现在代码就不起作用了。
-
从技术上讲,您可以依赖
int i; int q = i;,但正如您所展示的那样,它很容易损坏。我建议不要这样做,但最终这可能是一个见仁见智的问题。 -
对于情况 (2) 提高编译器警告级别 - 实时 - godbolt.org/z/e6Mv1hhTz
标签: c++ class initialization class-members