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

Array initialization with only one constructor call

本文关键字:函数调用 初始化 数组 一个      更新时间:2023-10-16

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

Foo bar[23] = Foo();

编辑:

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

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

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

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

Foo bar[23];

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

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

编译器将尝试转换每个初始值设定项(可以是任意表达式)转换为Foo,并使用它初始化元素。如果没有足够的初始化器表达式,则下面的所有元件都将用CCD_ 3进行初始化。

编辑:

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

Foo bar[23];

取决于变量的生存期:如果它有静态生存期,它将零初始化;否则,它根本不会被初始化。在任一在这种情况下,可以使用聚合初始化来强制初始化你想要:

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

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

Foo bar[23] = {};

将零初始化所有成员。

为了完整起见,我应该指出聚合初始化不能用于类成员:初始化C的唯一方法样式数组成员是通过在构造函数的主体,或通过复制初始化:定义静态Foo并用它初始化成员。

我可能还应该指出,以上所有内容都涉及C++03。C++11引入了扩展的初始化语法;尤其是你可以对类使用类似于聚合初始化的东西成员。(我觉得我对C++11不是很熟悉我的所有编译器都支持它。)

如果你愿意使用std::vector,你可以使用这个:

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

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

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

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

尝试

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