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

Dir*_*irk 0 c++ arrays

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

Foo bar[23] = Foo();
Run Code Online (Sandbox Code Playgroud)

编辑:

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

vtkSmartPointer<Foo> bar[23] = vtkSmartPointer<Foo>::New();
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*nze 7

不是这个语法,但如果Foo有一个非平凡的默认构造函数,

Foo bar[23];
Run Code Online (Sandbox Code Playgroud)

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

Foo bar[23] = { x, y, z... };
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Foo bar[23];
Run Code Online (Sandbox Code Playgroud)

取决于变量的生命周期:如果它有静态生命周期,它将初始化为零; 否则,它根本不会被初始化.在任何一种情况下,您都可以使用聚合初始化来强制进行所需的初始化:

Foo bar[23] = { { firstMember, secondMember... }, ... };
Run Code Online (Sandbox Code Playgroud)

如果初始化程序不足,则剩余的元素初始化为零,因此:

Foo bar[23] = {};
Run Code Online (Sandbox Code Playgroud)

将零初始化所有成员.

为了完整起见,我应该指出聚合初始化不能用于类成员:初始化C样式数组成员的唯一方法是通过赋值给每个元素,在构造函数的主体中,或者通过复制初始化:define静态 Foo并用它初始化成员.

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

  • +1一个精美的概要.要真正彻底,或许在这里添加一些关于POD结构的行为? (2认同)