gpt4 book ai didi

c++ - 为什么要按照声明的顺序初始化成员变量?

转载 作者:IT老高 更新时间:2023-10-28 13:23:55 25 4
gpt4 key购买 nike

我今天写了一些代码,得到一个奇怪的编译错误,这似乎是由于初始化成员变量的顺序与声明的顺序不同。

例子:

class Test {
int a;
int b;

public:
Test() : b(1), a(2) {
}
};

int main() {
Test test;
return 0;
}

如果我用 -Werror -Wall 编译它:

$ g++ -Werror -Wall test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:3:9: error: ‘Test::b’ will be initialized after [-Werror=reorder]
test.cpp:2:9: error: ‘int Test::a’ [-Werror=reorder]
test.cpp:6:5: error: when initialized here [-Werror=reorder]
cc1plus: all warnings being treated as errors

我意识到 -Wall 明确要求 GCC 过分警告,但我认为所有这些都是有原因的。那么,初始化成员变量的顺序有什么关系呢?

最佳答案

原因是因为它们是按照它们在你的类中声明的顺序进行初始化的,而不是你在构造函数中初始化它们的顺序,它警告你你的构造函数的顺序不会被使用。

这是为了帮助防止 b 的初始化依赖于 a 或反之亦然的错误。

这种排序的原因是因为只有一个析构函数,它必须选择一个“相反的顺序”来销毁类成员。在这种情况下,最简单的解决方案是使用类中的声明顺序来确保属性始终以正确的相反顺序销毁。

关于c++ - 为什么要按照声明的顺序初始化成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com