我如何使用成员初始化列表来初始化一个数组?

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开始:

为了初始化 Ttypes的对象,意味着:

  • 如果T是一个带有用户声明的构造函数的类types,那么将调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不合格)。
  • 如果T是没有用户声明的构造函数的非联合类types,那么T的每个非静态数据成员和基类组件都被初始化;
  • 如果T是一个数组types,那么每个元素都是值初始化的;
  • 否则,该对象是零初始化的

初始化 Ttypes的对象意味着:

  • 如果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)};