如何在C ++类的初始化列表中初始化member-struct?
我在c ++中有以下类定义:
struct Foo { int x; char array[24]; short* y; }; class Bar { Bar(); int x; Foo foo; };
并希望在Bar类的初始化程序中将“foo”结构(及其所有成员)初始化为零。 这可以做到这一点:
Bar::Bar() : foo(), x(8) { }
…?
或者foo(x)在初始化列表中做了什么?
还是该结构甚至从编译器自动初始化为零?
首先,你应该(必须!)阅读这个关于POD和聚合的c ++常见问题 。 在你的情况下, Foo
确实是一个POD类,而foo()
是一个初始化值 :
为了初始化Ttypes的对象,意味着:
- 如果T是一个具有用户声明的构造函数(12.1)的类types(第9节),则是默认的构造函数
因为T被调用(如果T没有可访问的默认构造函数,则初始化是不合格的);- 如果T是没有用户声明的构造函数的非联合类types,那么T的每个非静态数据成员和基类组件都被初始化值;
- 如果T是一个数组types,那么每个元素都是值初始化的;
- 否则,该对象是零初始化的
所以是的,foo将被初始化为零。 请注意,如果您从Bar
构造函数中删除了这个初始化, foo
将仅被默认初始化 :
如果没有为对象指定初始化程序,并且对象是(可能是cv-qualified)非POD类types(或其数组),则该对象应该被默认初始化; 如果对象是const限定types的,则底层类types应该有一个用户声明的默认构造函数。 否则,如果没有为非静态对象指定初始化器,则该对象及其子对象(如果有)具有不确定的初始值 ;
在标准的C ++中,你需要为Foo创build一个ctor。
struct Foo { Foo(int const a, std::initializer_list<char> const b, short* c) : x(a), y(c) { assert(b.size() >= 24, "err"); std::copy(b.begin(), b.begin() + 24, array); } ~Foo() { delete y; } int x; char array[24]; short* y; }; class Bar { Bar() : x(5), foo(5, {'a', 'b', ..., 'y', 'z'}, new short(5)) { } private: int x; Foo foo; };
在C ++ 0x中,你可以使用统一的初始化列表,但是你仍然需要dtor for Foo:
class Bar { Bar() : x(5), foo{5, new char[24]{'a', 'b', ..., 'y', 'z'}, new short(5)} { } ~Bar() { delete[] foo.array; delete foo.y;} } private: int x; Foo foo; };
要默认初始化foo
(如Bar() : foo(), x(8) { }
),您需要给Foo一个默认的ctor。