仅使用一个构造函数调用的数组初始化

时间:2012-03-01 08:50:12

标签: c++ arrays

在cpp中,这或类似的可能吗?

Foo bar[23] = Foo();

编辑:

问题的动机是我认为我看到有人使用这种语法

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

并想知道它为什么编译以及实际创建了多少新对象......

4 个答案:

答案 0 :(得分:7)

不使用此语法,但如果Foo具有非平凡的默认值 构造,

Foo bar[23];

将为数组的每个成员调用它。更一般地说,你也可以 写:

Foo bar[23] = { x, y, z... };

编译器将尝试转换每个初始化程序(可以是 任意表达式)到Foo,并用它来初始化 数组的元素。如果没有足够的初始化表达式, 然后,所有以下元素将使用Foo()进行初始化。

编辑:

由于有几条评论要求它:如果Foo没有用户定义 构造函数,情况发生变化(因为调用“构造函数”) 不会做任何事情)。在这种情况下,行为:

Foo bar[23];

取决于变量的生命周期:如果它有静态生命周期,它将是 零初始化;否则,它根本不会被初始化。在任何一个 例如,您可以使用聚合初始化来强制初始化 你想要的:

Foo bar[23] = { { firstMember, secondMember... }, ... };

如果没有足够的初始值设定项,则剩余的元素为零 初始化,所以:

Foo bar[23] = {};

将零初始化所有成员。

为了完整性,我应该指出聚合初始化 不能用于类成员:只能初始化C的方法 样式数组成员是通过赋值给每个元素的 构造函数的主体,或通过复制初始化:定义静态 Foo并使用它初始化成员。

我应该也指出,以上所有都是指C ++ 03。 C ++ 11引入了扩展初始化语法;特别是你 可以使用看起来像类的聚合初始化的东西 成员也是。 (我想 - 我不太熟悉C ++ 11,不是 我的所有编译器都支持它。)

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

您可以使用以下语法初始化数组:

struct Foo
{
};

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

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

答案 3 :(得分:0)

尝试

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