gpt4 book ai didi

c++ - 仅调用一次构造函数的数组初始化

转载 作者:太空宇宙 更新时间:2023-11-04 14:45:41 27 4
gpt4 key购买 nike

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

Foo bar[23] = Foo();

编辑:

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

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

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

最佳答案

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

Foo bar[23];

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

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

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

编辑:

因为有几条评论要求它:if Foo doesn't have a user defined构造函数,情况发生了变化(自从调用“构造函数”不会做任何事情)。在这种情况下,行为:

Foo bar[23];

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

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

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

Foo bar[23] = {};

将零初始化所有成员。

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

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

关于c++ - 仅调用一次构造函数的数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com