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中,指向数据成员的指针具有全一位空表示.
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.
Bar*_*nau 10
对于基本类型,默认初始化意味着对象初始化为0,0.0或NULL,适合该类型.
编辑:以上内容适用于C++ 98.在C++ 03中,术语重新定义了一下.现在,使用初始化()(在语法上只对成员对象可能)会导致值初始化,对于原始类型,这意味着存储适当的0,0.0或NULL值.
| 归档时间: |
|
| 查看次数: |
26604 次 |
| 最近记录: |