如何使用成员初始化列表来初始化数组?
问题描述:
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)};
等待,而不是C++ 0x吗? D: – GManNickG 2011-04-09 00:42:59
那么,在C++ 0x中,理解(我希望!)你应该总是在C数组上使用'std :: array ',它可以被合理且廉价地初始化并从静态成员函数返回用于c'tor初始化列表中。 – ildjarn 2011-04-09 00:46:00
@GMan:的确如此。你不能用'std :: initializer_list '初始化一个数组,因为数组没有构造函数。您仍然最终在封闭类型的构造函数体中遍历_something_。 ildjarn说,这不是真正的问题。 – 2011-04-09 01:55:00