首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++11中类数据成员的默认初始化

C++11中类数据成员的默认初始化
EN

Stack Overflow用户
提问于 2015-12-21 06:08:43
回答 4查看 11.9K关注 0票数 17

我对类数据成员的默认初始化感到困惑。这是示例代码。

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

class A {
public:
  int i;
  A() {}
};

A a1;
A aa1[3];
std::vector<A> av1(3);

int main()
{
  A a2;
  A aa2[3];
  std::vector<A> av2(3);
  std::cout << a1.i << " " << a2.i << std::endl;          // 0         undefined
  std::cout << aa1[0].i << " " << aa2[0].i << std::endl;  // 0         undefined
  std::cout << av1[0].i << " " << av2[0].i << std::endl;  // undefined undefined
}

在上面的代码中,只有a1.iaa1[0~2].i被初始化为0,而其他的则未初始化。我不知道为什么会这样。

具体来说,我已经知道(来自"C++ Primer"):

  • 初始化过程是:
代码语言:javascript
运行
复制
- `a1` and `a2` are _default initialized_.
- every element of `aa1` and `aa2` are _default initialized_.
- every element of `av1` and `av2` are _value initialized_.

  • 默认初始化的过程是:
代码语言:javascript
运行
复制
- check if the variable is _built-in type_ or _class type_.
- for _built-in type_, if the variable is outside any function body, then it is initialized to 0, else the value is undefined.
- for _class type_, if the class has default ctor, then that is called, else it is a compile error.

  • 值初始化的过程是:
代码语言:javascript
运行
复制
- check if the variable is _built-in type_ or _class type_.
- for _built-in type_, it is initialized to 0.
- for _class type_, it is _default initialized_. (Which I think means if the class has default ctor, then that is called, else it is a compile error.)

这样,当调用ctor A::A()时,数据成员A::i是如何初始化的(我猜它是默认初始化的)?为什么只有a1.iaa1[0~2].i被初始化为0,而其他的则未初始化?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-21 06:27:19

当调用ctor A::A()时,数据成员A::i如何初始化

如果未提供初始化程序,则适用默认初始化规则。构造函数不初始化A::i,因此未初始化;它的值是不确定的。这一点毫无疑问。摘录自关于默认初始化的文档

如果T是类类型,则考虑构造函数并对空参数列表进行过载解析。调用选定的构造函数(这是默认构造函数之一),为新对象提供初始值。

为什么只有a1.i和AA102.i被初始化为0,而其他则未初始化?

全局数据内存被初始化为零,即整个部分被归零,因此您可以看到全局A::i的初始化为0。注意,构造函数不会这样做。摘录自文档

静态初始化 ..。 2)对于所有其他非本地静态变量和线程局部变量,都会发生零初始化。在实践中,将被零初始化的变量放置在程序映像的.bss段中,它在磁盘上没有占用空间,并在加载程序时由操作系统将其归零。

但是,对于vectorvector本身位于非本地静态内存中,而其元素被分配到空闲存储(堆)中,因此它们的成员也未初始化。

票数 9
EN

Stack Overflow用户

发布于 2015-12-21 06:24:04

全局变量(包括静态变量和导出变量)都是零初始化的(实际上,在通常的平台上,它们在内存中,在程序开始时是用零填充的),如果它们没有显式初始化并且没有构造函数。

在使用代码中使用的构造函数时,向量项是默认初始化的。

对于向量类对象,两者都意味着一个构造函数调用。但对于整数,首先意味着初始化为零,而后者意味着用不定值初始化。因此,代码中的纯int变量是零初始化的,但是向量中的int变量是默认初始化的。

供参考的一些链接:

  • 初始化
  • 初始化
票数 2
EN

Stack Overflow用户

发布于 2015-12-21 06:19:57

您为A声明了一个构造函数,因此没有默认的i初始化;这是构造函数中的责任。全局变量的初始值为0,因为它们是全局的。如果不以某种方式给出初始值,则所有全局值都初始化为0。

局部变量和向量获取随机数据,因为这些A实例使用的堆栈(局部变量)或堆(用于向量使用的分配内存)中的内存就是这样。

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

https://stackoverflow.com/questions/34389849

复制
相关文章

相似问题

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