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

C++ 已声明但未初始化项的初始化列表,c++,initialization,list-initialization,C++,Initialization,List Initialization,当我没有初始化所有项目时,我有一个关于初始化列表的问题 假设我有以下代码: class Example { int a, b, c; Example() : a(1), b(2), c(3) {} } 我知道成员的初始化顺序是由他们的声明顺序定义的,而不是由他们在初始化列表中列出的顺序定义的,但是,如果我在初始化列表中没有b呢 class Example { int a, b, c; Example() : a(1), c(2) {} } a是否会用1初始化,b是否会用未

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

假设我有以下代码:

class Example {
  int a, b, c;

  Example() : a(1), b(2), c(3) {}
}
我知道成员的初始化顺序是由他们的声明顺序定义的,而不是由他们在初始化列表中列出的顺序定义的,但是,如果我在初始化列表中没有b

class Example {
  int a, b, c;

  Example() : a(1), c(2) {}
}
a是否会用1初始化,b是否会用未定义的值初始化,c是否会用3初始化?我会因为没有严格按照我声明的顺序调用初始化列表而得到未定义的行为吗?还是什么都没有


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

不初始化初始值设定项列表中的成员不会导致未定义的行为。阅读它是一种未定义的行为。未初始化的
int
将被默认初始化,使其处于不确定状态。

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

因此,
b
的值显然不值得信任。您还应该收到一条警告消息,上面写着:

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


<> P>考虑从代码中清除警告消息是一个好的做法,不应该用这种方法开发严肃的项目。

我认为它是UB在C++中读取它,不管它是否有陷阱表示(不像C)。更改了我的答案。@juanchopanza-see@ShafikYaghmour
int
不是一个窄字符类型,所以我看不出这个问题在这里有什么关系。@swardfish它对所有不确定类型都有答案我明白了,但是如果我在我的类中有20个属性,我只需要初始化2个呢?方法是创建一个大的初始化列表并初始化所有这些属性?@CaioGomes只要不读取未初始化的数据,就可以了!
#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;
}
1 32766 2
1 0 2
1 0 2