我如何使用成员初始化列表来初始化一个数组?
class A { public: A(); private: char a[5]; int* ptr; }; A::A() : a(0), ptr(0) { }
这是正确的吗?
C ++ 03中用C数组做的唯一明智的事情就是对它进行值初始化(在C ++ 11中,并且可以在列表中初始化)。
从C ++ 03标准§8.5/ 7:
对象的初始化方法是一组空括号,即(),应进行值初始化。
从§8.5/ 5开始:
为了初始化
T
types的对象,意味着:
- 如果
T
是一个带有用户声明的构造函数的类types,那么将调用T
的默认构造函数(如果T
没有可访问的默认构造函数,则初始化不合格)。- 如果
T
是没有用户声明的构造函数的非联合类types,那么T的每个非静态数据成员和基类组件都被初始化;- 如果
T
是一个数组types,那么每个元素都是值初始化的;- 否则,该对象是零初始化的
要初始化
T
types的对象意味着:
- 如果
T
是标量types,则将该对象设置为转换为T
的值0
(零);- 如果
T
是非联合类types,则每个非静态数据成员和每个基类子对象都被初始化;- 如果
T
是联合types,则该对象的第一个命名数据成员)将被初始化;- 如果
T
是一个数组types,则每个元素都是零初始化的;- 如果
T
是引用types,则不执行初始化。
所以,如果你的构造函数定义更改为
A::A() : a(), ptr() { }
那么你可以保证在构build后, A::a
所有5个元素的值都是'\0'
而A::ptr
将是null。
不怕; C ++不支持像这样初始化数组。
你只需要在A
的构造函数体内赋值给它的成员,或者如果你真的不在乎值是什么,你可以使用值初始化 :
struct A { int x[5]; A() : x(); };
虽然C ++ 0x让你给所有的值:
struct A { int x[5]; A() : x{1,2,3,4,5} {} };
但请注意,因为数组不是class-object
,所以不能这样做:
struct A { int x[5]; A(std::initializer_list<int[5]>& i) // or whatever the T should be : x{i} // or x(i) {} } A a({1,2,3,4,5)};