2012-03-01 114 views
0

在cpp中,这是可能的吗?只有一个构造函数调用的数组初始化

Foo bar[23] = Foo(); 

编辑:

对于这个问题的动机是,我想我看到有人用这种语法

vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New(); 

,并想知道为什么它编译,实际上是如何创造了许多新对象..

+0

这是什么意思?都是'Foo bar [i] == f'?他们每个人都有一个新的Foo()? ... – xtofl 2012-03-01 09:00:24

回答

7

不使用此语法,但如果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,因为不是我所有的编译器都支持它的 )。

+2

+1精美的简介。要真的彻底,也许在这里添加一些关于POD结构的行为? – 2012-03-01 08:59:41

+0

我同意Karl的观点:类型'Foo'的行为最终未初始化可能是一个难题。 – 2012-03-01 11:39:06

1

您可以使用以下语法初始化阵列:

struct Foo 
{ 
}; 

Foo x[2] = {Foo(), Foo()}; 
//or 
Foo y[] = {Foo(), Foo()}; 

在后一种情况下,数组的大小从初始化中推导出来。

+0

你在哪里看到构造函数初始值设定项列表? – 2012-03-01 08:52:48

+0

@KarlKnechtel我误解了这个问题。 – 2012-03-01 08:53:45

0

尝试

Foo bar[23] = { Foo(), Foo(), Foo(), /* ... 23 of them */ }; 
+1

不需要,因为编译器无论如何都会这样做。 – 2012-03-01 08:57:53

+0

那么,对于默认初始化,当然,但我假设OP正在寻找更多的灵活性。 – 2012-03-01 08:59:09

3

如果你愿意使用std::vector,您可以使用此:

std::vector<Foo> bar(23, Foo()); // initialize bar with 23 copies of Foo() 
+1

或者仅仅是'std :: vector bar(23)',它用23个默认构建的'Foo'对象(在C++ 11中通常会稍微优化)初始化'bar'。 – MSalters 2012-03-01 08:58:33