首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已声明但未初始化的项的初始化列表

已声明但未初始化的项的初始化列表
EN

Stack Overflow用户
提问于 2018-11-07 23:26:58
回答 2查看 1.4K关注 0票数 3

当我没有初始化所有项目时,我有一个关于初始化列表的问题。

假设我有以下代码:

代码语言:javascript
复制
class Example {
  int a, b, c;

  Example() : a(1), b(2), c(3) {}
}

我知道,成员的初始化顺序是根据它们的声明顺序来定义的,而不是按照它们在初始化列表中列出的顺序来定义的,但是,如果初始化列表中没有像下面这样的b呢?

代码语言:javascript
复制
class Example {
  int a, b, c;

  Example() : a(1), c(2) {}
}

a会用1初始化,b用未定义的值初始化,c使用3E 213初始化?如果没有严格按照我声明的顺序调用初始化列表,我会得到一个未定义的行为吗?还是什么都不做?

我之所以问这个问题,是因为我有一个包含大量数据的类,我希望确保其中一些类有一个初始值,但我不需要初始化所有这些数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-07 23:31:18

不初始化初始化程序列表中的成员不会导致未定义的行为。读它是一种不明确的行为。未初始化的int将默认初始化,从而使其处于不确定状态。

票数 4
EN

Stack Overflow用户

发布于 2018-11-07 23:44:41

未定义行为的概念取决于这里的上下文。关键是您的代码不应该信任非初始化变量的值。例如,考虑这段代码(从示例中扩展):

代码语言:javascript
复制
#include <iostream>

class Example {
public:
    int a, b, c;
    Example() : a(1), c(2) {}
};

void print(const Example& e) {
    std::cout << e.a << ' ' << e.b << ' ' << e.c << '\n';
}

int main()
{
    Example e, f, g;
    print(e);
    print(f);
    print(g);
    return 0;
}

当我运行它时,我得到:

代码语言:javascript
复制
1 32766 2
1 0 2
1 0 2

因此,b的价值显然不应该被信任。您还应该收到一条警告信息,其中说:

构造函数不初始化这些字段:b

考虑到清除代码中的警告消息是一个很好的实践,您不应该使用这种方法开发严肃的项目。

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

https://stackoverflow.com/questions/53199440

复制
相关文章

相似问题

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