如何使用成员初始化列表初始化数组?

时间:2011-04-09 00:20:57

标签: c++ constructor

class A {
public:
   A();

private:
   char a[5];
   int* ptr;
};

A::A() : a(0), ptr(0) { }

这是对的吗?

2 个答案:

答案 0 :(得分:18)

你可以用C ++ 03中的C数组做的唯一明智的事情是对它进行值初始化(在C ++ 11及更高版本中可以进行列表初始化)。

来自C ++ 03标准,§8.5/ 7:

  

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。

来自§8.5/ 5:

  

value-initialize T类型的对象意味着:

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

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

     
      
  • 如果T是标量类型,则将对象设置为0(零)转换为T的值;
  •   
  • 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;
  •   
  • 如果T是联合类型,则对象的第一个命名数据成员)是零初始化的;
  •   
  • 如果T是数组类型,则每个元素都是零初始化的;
  •   
  • 如果T是引用类型,则不执行初始化。
  •   

因此,如果您的构造函数定义更改为

A::A() : a(), ptr() { }

然后保证在构建后,A::a的所有5个元素的值为'\0'A::ptr将为null。

答案 1 :(得分:3)

害怕没有; C ++不支持像这样初始化数组。

您只需要在A的构造函数体中分配给它的成员,或者如果您不关心值是什么,则可以使用 value-initialisation

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)};