Jan*_*egg 47 c++ constructor struct list initializer
我在c ++中有以下类定义:
struct Foo {
int x;
char array[24];
short* y;
};
class Bar {
Bar();
int x;
Foo foo;
};
Run Code Online (Sandbox Code Playgroud)
并且想要在Bar类的初始值设定项中将"foo"结构(及其所有成员)初始化为零.可以这样做:
Bar::Bar()
: foo(),
x(8) {
}
Run Code Online (Sandbox Code Playgroud)
......?
或者foo(x)在初始化列表中的作用是什么?
或者结构甚至从编译器自动初始化为零?
ice*_*ime 51
首先,你应该(必须!)阅读关于POD和聚合的这个c ++ faq.在你的情况下,Foo确实是一个POD类,并且foo()是一个值初始化:
对值类型T的对象进行值初始化意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则
调用T 的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);- 如果T是没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
- 如果T是数组类型,那么每个元素都是值初始化的;
- 否则,该对象被零初始化
所以是的,foo将被零初始化.请注意,如果从Bar构造函数中删除了此初始化,则foo只会默认初始化:
如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化; 如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数. 否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有)具有不确定的初始值 ;
在标准C++中,你需要为Foo做一个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;
};
Run Code Online (Sandbox Code Playgroud)
在C++ 0x中,您可以使用统一初始化列表,但仍然需要foo的dtor:
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;
};
Run Code Online (Sandbox Code Playgroud)
要默认初始化foo(as Bar() : foo(), x(8) { }),您需要为Foo提供默认的ctor.
| 归档时间: |
|
| 查看次数: |
74138 次 |
| 最近记录: |