在cpp中,这是可能的吗?只有一个构造函数调用的数组初始化
Foo bar[23] = Foo();
编辑:
对于这个问题的动机是,我想我看到有人用这种语法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
,并想知道为什么它编译,实际上是如何创造了许多新对象..
在cpp中,这是可能的吗?只有一个构造函数调用的数组初始化
Foo bar[23] = Foo();
编辑:
对于这个问题的动机是,我想我看到有人用这种语法
vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
,并想知道为什么它编译,实际上是如何创造了许多新对象..
不使用此语法,但如果Foo
有一个不平凡的默认 构造,
Foo bar[23];
会为每个膜调用它阵列的呃。更一般地,还可以 写:
Foo bar[23] = { x, y, z... };
编译器将尝试每个初始化(其可以是 任意表达式)转换成Foo
,并用它来初始化所述阵列的所述元件 。如果没有足够的初始化表达式,则 将使用Foo()
对以下所有元素进行初始化。
编辑:
因为一些评论问它:如果富没有一个用户定义的 构造,形势的变化(因为调用“构造” 什么都不会做)。在这种情况下,的行为:
Foo bar[23];
取决于变量的生命周期:如果有静态的一生中,这将是 初始化为零;否则,它根本不会被初始化。在这两种情况下 ,您可以使用集合初始化强制初始化 你想:
Foo bar[23] = { { firstMember, secondMember... }, ... };
如果没有足够的初始化,其余元素为零 初始化,因此:
Foo bar[23] = {};
将零初始化所有成员。
为了完整起见,我应该指出的是,集合初始化 不能用于类成员:唯一的方法可以初始化一个C 风格阵列构件是由分配给每个元件的手段,在 体的构造的或者通过复制初始化:定义一个静态的 Foo
并用它初始化成员。
我也许应该指出,以上所有都是指C++ 03。 C++ 11引入了一个扩展的初始化语法;特别是,您可以使用类似 成员的类似于聚合初始化的东西, 也可以。 (我认为—我不太熟悉C++ 11,因为不是我所有的编译器都支持它的 )。
+1精美的简介。要真的彻底,也许在这里添加一些关于POD结构的行为? – 2012-03-01 08:59:41
我同意Karl的观点:类型'Foo'的行为最终未初始化可能是一个难题。 – 2012-03-01 11:39:06
您可以使用以下语法初始化阵列:
struct Foo
{
};
Foo x[2] = {Foo(), Foo()};
//or
Foo y[] = {Foo(), Foo()};
在后一种情况下,数组的大小从初始化中推导出来。
你在哪里看到构造函数初始值设定项列表? – 2012-03-01 08:52:48
@KarlKnechtel我误解了这个问题。 – 2012-03-01 08:53:45
尝试
Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ };
不需要,因为编译器无论如何都会这样做。 – 2012-03-01 08:57:53
那么,对于默认初始化,当然,但我假设OP正在寻找更多的灵活性。 – 2012-03-01 08:59:09
如果你愿意使用std::vector
,您可以使用此:
std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo()
或者仅仅是'std :: vector
这是什么意思?都是'Foo bar [i] == f'?他们每个人都有一个新的Foo()? ... – xtofl 2012-03-01 09:00:24