C++ 为什么要按它们声明的顺序初始化成员变量?

Spoony 64.35m2021-03-201190 次点击
```
class Test {‌
int a;
int b;

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

int main() {‌
Test test;
return 0;
}
```
编译它会报错
```
$ 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
```

原因是因为它们是按它们在类中声明的顺序进行初始化的,而不是在构造函数中初始化它们的顺序,它警告你构造函数的顺序不会被使用。
这是为了帮助防止错误,其中b的初始化取决于a,反之亦然。

这种排序的原因是因为只有一个析构函数,它必须选择一个“逆序”来销毁类成员。在这种情况下,最简单的解决方案是使用类中的声明顺序,以确保属性总是以正确的相反顺序销毁。
收藏 ♥ 感谢
FANG 12.15m 2021-03-22 
很好的例子,这直接引入了一个新的面试题

登录注册 后可回复。



GitHub