class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
ild*_*arn 18
你可以用C++ 03中的C数组做的唯一合理的事情是对它进行值初始化(在C++ 11及更高版本中可以进行列表初始化).
从C++ 03标准,§8.5/ 7:
初始值为空集括号的对象,即(),应进行值初始化.
从§8.5/ 5开始:
对值初始化类型的对象
T意味着:
- if
T是具有用户声明的构造函数的类类型,然后T调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);- 如果
T是没有用户声明的构造函数的非联合类类型,则每个非静态数据成员和基类组件T都是值初始化的;- 如果
T是数组类型,则每个元素都是值初始化的;- 否则,该对象被零初始化
到零初始化的类型的对象
T是指:
- 如果
T是标量类型,则将对象设置为0(零)转换为的值T;- 如果
T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;- if
T是一个联合类型,该对象的第一个命名数据成员)是零初始化的;- if
T是数组类型,每个元素都是零初始化的;- 如果
T是引用类型,则不执行初始化.
因此,如果您的构造函数定义更改为
A::A() : a(), ptr() { }
Run Code Online (Sandbox Code Playgroud)
然后你保证在构造后,所有5个元素都A::a将具有值'\0'并且A::ptr将为null.