当前位置: 首页 > 知识库问答 >
问题:

C为什么成员没有默认初始化?

耿和韵
2023-03-14

如果我有一个struct Foo和一个struct Bar:

struct Foo {
  int a, b;
};

struct Bar {
  Foo foo;  
  int c;
};

如果我初始化一个条并打印正确得到的值:

int main() {
  Bar bar = {}; // I call the default constructor
  std::cout << bar.foo.a << " "; // 0
  std::cout << bar.foo.b << " "; // 0
  std::cout << bar.c << std::endl; // 0

  return 0;
}

但是现在如果我声明这样的构造函数:

struct Bar {
  Bar() : c(5) {}

  Foo foo;  
  int c;
};

我失去了Bar::foo的默认构造,程序输出了32764 0 5!

为什么我不得不像这样无声地初始化每个成员变量:

struct Bar {
  Bar() : c(5) {}

  Foo foo{};  
  int c;
};

只要我声明一个构造函数?在这种情况下,为什么默认构造不起作用?

共有1个答案

姜振濂
2023-03-14

在C语言中,如果您有一个默认构造函数,并且变量没有用初始值设定项列表初始化,那么它将默认构造为一个不确定的值。这是一个值得注意的行为,尚未修复,因此我认为它要么是有意的,要么更可能被接受。

来自CPP参考:

具有自动和动态存储持续时间的非类变量的默认初始化会产生具有不确定值的对象(静态和线程本地对象初始化为零)

无法默认初始化引用和常量标量对象。

 类似资料:
  • AFAIK在构造函数初始值设定项列表中不初始化其成员数据的类/结构/联合,那么它们是默认初始化的。如果成员数据是内置整数类型,则其值不确定。如果它是类类型,则调用其默认ctor(需要可访问且未删除的默认ctor)。 这是我的例子: 输出: 这样,构造函数不会显式初始化其ctor init列表中的成员d和a,因此它们是默认init<代码>d_有一个未定义的值。而a_是默认初始化 在这里之前,我很好,

  • 问题内容: 在C ++中,可以在构造函数开始运行之前使用初始化列表来初始化类的字段。例如: 我很好奇为什么Java没有类似的功能。根据 Core Java:第1卷 : C ++使用这种特殊语法来调用字段构造函数。在Java中,因为对象没有子对象,而只有指向其他对象的指针,所以不需要它。 这是我的问题: “由于对象没有子对象”是什么意思?我不知道什么是子对象(我尝试查找它);它们是否意味着扩展超类的

  • Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的

  • 为什么x没有在下面初始化? 平均而言,对于一半的迭代,for循环中的将是,从而初始化。对于另一半,找到的 循环替换为 同样糟糕。只有

  • 问题内容: 所以我要声明并初始化一个int数组: 说我改为这样做… … 0将按标准输出。另外,如果我这样做: 将按标准输出。那么默认如何初始化我的数组?是否可以安全地假设默认的初始化将数组索引设置为零,这意味着我不必遍历数组并对其进行初始化? 问题答案: Java程序中未由程序员明确设置为所有内容的所有内容都初始化为零值。 对于的引用(任何包含对象的内容)。 对于int / short / byt

  • 我想学习pygame,所以我把它下载到VS代码中并开始编码。正如您所知,首先要做的事情之一是导入pygame,然后再导入pygame。init()当我这样做时,有一个错误,说pygame没有init成员。该消息会弹出一些pygame功能,如pygame。quit(),但不能与其他对象(如pygame)一起使用。时间时钟()。我在网上寻找答案,发现一些帖子告诉我在设置中添加一些东西。json——当我