首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我要按照声明成员变量的顺序初始化它们呢?

为什么我要按照声明成员变量的顺序初始化它们呢?
EN

Stack Overflow用户
提问于 2012-09-01 05:01:20
回答 6查看 29.8K关注 0票数 79

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

示例:

代码语言:javascript
运行
复制
class Test {
    int a;
    int b;

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

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

然后如果我用-Werror -Wall编译它

代码语言:javascript
运行
复制
$ 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发出警告,但我认为所有这些警告都是有原因的。那么,初始化成员变量的顺序又有什么关系呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-01 05:09:46

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

这有助于防止在b的初始化依赖于a时出错,反之亦然。

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

票数 112
EN

Stack Overflow用户

发布于 2012-09-01 05:14:52

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

成员将按照声明的相同顺序进行初始化,无论您是否愿意。该警告告诉您,您请求的顺序与执行初始化的实际顺序不同。

票数 50
EN

Stack Overflow用户

发布于 2012-09-01 05:04:39

你不应该这样做,因为它降低了可读性,并且可能会产生误导。

如果你这样做了:

代码语言:javascript
运行
复制
Test() : b(1), a(b) {}

看起来ba都设置为1,而实际上b的未初始化值用于在b初始化为1之前初始化a

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12222417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档