首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >默认初始化混乱

默认初始化混乱
EN

Stack Overflow用户
提问于 2012-11-17 13:17:59
回答 2查看 301关注 0票数 3

在我的C++初级版第5版中,他们在第43页提到默认初始化(强调我的):

未显式初始化的内置类型对象的值取决于定义对象的位置。在任何函数体之外定义的变量被初始化为零.

稍后,在第73页中,他们定义了这样一个新类:

代码语言:javascript
复制
struct Sales_data {
  std::string bookNo;
  unsigned units_sold = 0;
  double revenue = 0.0;
};

这将提供一个新标准的类内初始化器的示例。在这种情况下,units_soldrevenue将初始化为零。他们说,如果不是,变量将被默认初始化。

但这是我的问题:在课堂上初始化有什么意义?让他们默认初始化有什么不对?我问的原因是,他们已经提到在任何函数体之外定义的变量被初始化为零,在本例中,这些变量不在任何函数中-它们在类定义中。所以默认初始化应该将这些变量初始化为零,不是吗?

EN

回答 2

Stack Overflow用户

发布于 2012-11-17 13:37:51

这句话似乎上下文不对。一个变量至少可以有3种状态:

  1. 默认初始化的:变量在构造函数中根据参数或无参数进行初始化。值初始化是这种类型的特例。
  2. 类内初始化:您在代码中展示的C++11特性
  3. Uninitialized:变量的初始化不在任何地方寻址,它可以包含任何垃圾值。一些编译器可能会自动将其设置为0或发出警告。
票数 2
EN

Stack Overflow用户

发布于 2012-11-17 13:36:54

关于“在任何函数体之外定义的变量”的第一个语句是指具有静态链接的对象,即在名称空间中声明的变量:这些变量是零初始化的。struct中的成员在这个struct所在的任何地方都会被初始化。如果它驻留在堆栈上或在堆上分配,则内建变量在没有赋值的情况下将不会被初始化,例如,当像这样使用时:

代码语言:javascript
复制
void f() {
    Sales_data data;
}

但是,即使没有声明中的初始化,如果像这样使用struct,它们也会得到零初始化:

代码语言:javascript
复制
Sales_data global; // <--- the "outside any function body" case
void f() {
    Sales_data data0 = {};
    Sales_data data1 = Sales_data();
    Sales_data data2{};
}

但是,所有这些都需要struct用户的协作,并显式地初始化它们以确保设置了值。

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

https://stackoverflow.com/questions/13430944

复制
相关文章

相似问题

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