什么是在C++中默认初始化的基本类型?

sha*_*oth 34 c++ initialization

当我使用初始化列表时:

struct Struct {
    Struct() : memberVariable() {}
    int memberVariable;
};
Run Code Online (Sandbox Code Playgroud)

基本类型(int,bool,float,enum,指针)成员变量是默认-initialied.是实现定义的值还是所有实现都相同?

Joh*_*itb 35

你不对.该对象不是默认初始化的,而是值初始化的.它的价值定义明确

int = 0, 
bool = false, 
float = 0.0f,  
enum = (enum type)0, 
pointer = null pointer
pointer to member = null member pointer
Run Code Online (Sandbox Code Playgroud)

请注意,零在任何枚举的值范围内,即使它不包含具有该vaue的显式枚举器,因此将枚举变量初始化为该值是安全的.

特别是对于指向数据成员的指针,实际使用的表示不是全零位.在至少由GCC和Clang使用的所谓的C++ Itanium ABI中,指向数据成员的指针具有全一位空表示.

  • 无论类型如何,都会初始化它的值.`int`不是非POD类类型. (2认同)

Pra*_*rav 29

标准说(8.5/5)

默认初始化T类型的对象意味着:

- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果Thas没有可访问的默认构造函数,则初始化是错误的);

- 如果T是数组类型,则每个元素都是默认初始化的;

- 否则,对象被零初始化.

.

对值类型T的对象进行值初始化意味着:

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

- 如果T是数组类型,则每个元素都是值初始化的;

- 否则,对象被零初始化

.

是实现定义的值还是所有实现都相同?

因此,所有实现的值都是相同的.

Struct 是非POD类型

 Struct *a =new Struct; // default initialization

 //memberVariable will be initialized to 0 because if T is a non-POD class type
 //the default constructor for T is called 

 Struct *b = new Struct(); //value initializes Struct, which calls the default ctor.

 //memberVariable will be initialized to 0 in this case also.
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@Johannes注意到原始类型(int,bool,float,enum,pointer)成员变量value-initialized不是default initialized.

  • 段落中的句子“-否则,对象将被零初始化”。6 `默认初始化一个 T 类型的对象意味着:`是错误的。正确的句子是`-否则,不进行初始化。` (2认同)
  • 这对于 C++03 是正确的,但从 C++11 开始更改:默认初始化的“否则”情况现在是“不执行初始化”。 (2认同)

Bar*_*nau 10

对于基本类型,默认初始化意味着对象初始化为0,0.0或NULL,适合该类型.

编辑:以上内容适用于C++ 98.在C++ 03中,术语重新定义了一下.现在,使用初始化()(在语法上只对成员对象可能)会导致值初始化,对于原始类型,这意味着存储适当的0,0.0或NULL值.