成都制作网站价格表,做网站域名是什么意思,seo站长综合查询工具,紫云网站建设我今天正在写一些代码#xff0c;并得到一个奇怪的编译错误#xff0c;这似乎是由初始化成员变量的顺序不同于他们声明的。
class Test {int a;int b;public:Test() : b(1), a(2) {}
};int main() {Test test;return 0;
}
然后#xff0c;如果我编译它与-Werror -Wall并得到一个奇怪的编译错误这似乎是由初始化成员变量的顺序不同于他们声明的。
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 [-Werrorreorder]
test.cpp:2:9: error: ‘int Test::a’ [-Werrorreorder]
test.cpp:6:5: error: when initialized here [-Werrorreorder]
cc1plus: all warnings being treated as errors
我意识到–Wall明确要求GCC过度警告但我认为有一个理由他们所有。那么初始化成员变量的顺序怎么样
原因是因为它们是按它们在类中声明的顺序进行初始化的而不是在构造函数中初始化它们的顺序它警告您构造函数的顺序不会被使用。 这是为了帮助防止错误其中b的初始化取决于a反之亦然。
这种排序的原因是因为只有一个析构函数它必须选择一个“逆序”来销毁类成员。在这种情况下最简单的解决方案是使用类中的声明顺序以确保属性总是以正确的相反顺序销毁。