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

问题描述:

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类型的对象是指:

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

零初始化T类型的对象是指:

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

所以,如果你的构造函数的定义改为

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

那么你是保证后期施工中,A::a所有5个元素的值将'\0'A::ptr将是无效的。

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

你只需要分配给其成员A的构造体,也可以使用值初始化,如果你真的不关心什么值

struct A { 
    int x[5]; 
    A() : x(); 
}; 

Ç ++ 0x中确实让你把所有的值,但:

struct A { 
    int x[5]; 
    A() : x{1,2,3,4,5} {} 
}; 

注意,虽然,因为数组不是class-object S,你将不能够做到这一点:

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

等待,而不是C++ 0x吗? D: – GManNickG 2011-04-09 00:42:59

+0

那么,在C++ 0x中,理解(我希望!)你应该总是在C数组上使用'std :: array ',它可以被合理且廉价地初始化并从静态成员函数返回用于c'tor初始化列表中。 – ildjarn 2011-04-09 00:46:00

+0

@GMan:的确如此。你不能用'std :: initializer_list '初始化一个数组,因为数组没有构造函数。您仍然最终在封闭类型的构造函数体中遍历_something_。 ildjarn说,这不是真正的问题。 – 2011-04-09 01:55:00