我对类数据成员的默认初始化感到困惑。这是示例代码。
#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.i和aa1[0~2].i被初始化为0,而其他的则未初始化。我不知道为什么会这样。
具体来说,我已经知道(来自"C++ Primer"):
- `a1` and `a2` are _default initialized_.
- every element of `aa1` and `aa2` are _default initialized_.
- every element of `av1` and `av2` are _value initialized_.
- 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.
- 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.i和aa1[0~2].i被初始化为0,而其他的则未初始化?
发布于 2015-12-21 06:27:19
当调用ctor A::A()时,数据成员A::i如何初始化
如果未提供初始化程序,则适用默认初始化规则。构造函数不初始化A::i,因此未初始化;它的值是不确定的。这一点毫无疑问。摘录自关于默认初始化的文档
如果T是类类型,则考虑构造函数并对空参数列表进行过载解析。调用选定的构造函数(这是默认构造函数之一),为新对象提供初始值。
为什么只有a1.i和AA102.i被初始化为0,而其他则未初始化?
全局数据内存被初始化为零,即整个部分被归零,因此您可以看到全局A::i的初始化为0。注意,构造函数不会这样做。摘录自文档
静态初始化 ..。 2)对于所有其他非本地静态变量和线程局部变量,都会发生零初始化。在实践中,将被零初始化的变量放置在程序映像的.bss段中,它在磁盘上没有占用空间,并在加载程序时由操作系统将其归零。
但是,对于vector,vector本身位于非本地静态内存中,而其元素被分配到空闲存储(堆)中,因此它们的成员也未初始化。
发布于 2015-12-21 06:24:04
全局变量(包括静态变量和导出变量)都是零初始化的(实际上,在通常的平台上,它们在内存中,在程序开始时是用零填充的),如果它们没有显式初始化并且没有构造函数。
在使用代码中使用的构造函数时,向量项是默认初始化的。
对于向量类对象,两者都意味着一个构造函数调用。但对于整数,首先意味着初始化为零,而后者意味着用不定值初始化。因此,代码中的纯int变量是零初始化的,但是向量中的int变量是默认初始化的。
供参考的一些链接:
发布于 2015-12-21 06:19:57
您为A声明了一个构造函数,因此没有默认的i初始化;这是构造函数中的责任。全局变量的初始值为0,因为它们是全局的。如果不以某种方式给出初始值,则所有全局值都初始化为0。
局部变量和向量获取随机数据,因为这些A实例使用的堆栈(局部变量)或堆(用于向量使用的分配内存)中的内存就是这样。
https://stackoverflow.com/questions/34389849
复制相似问题