向数组中添加具有构造函数的对象

C++ Adding objects that have constructors to an array

本文关键字:构造函数 对象 数组 添加      更新时间:2023-10-16

当我声明一个数组时,所有的变量/对象都被声明了。但是,如果对象的类有构造函数,那么对象会发生什么呢?我使用的类有2个构造函数-一个没有参数,一个有几个参数。第一个构造函数会在声明之后激活吗?或者没有构造函数被激活?

如果发生第一种情况,我将不得不创建一个函数来替换构造函数。

那么,新声明的数组中的对象会发生什么呢?

这取决于您如何声明数组。成员可以是default、value或copy-initialized:

Foo x[] = { Foo(1), Foo(true, 'a'), Foo() };  // copy-initialize
Foo x[3] = { };                               // value-initialize
Foo x[3];                                     // default-initialize

对于类类型,默认和值初始化调用默认构造函数。复制初始化可以直接调用相应的构造函数。

如果您不想使用默认构造函数,则不需要绕过大括号初始化式并拼写每个成员。

如果底层类型具有非平凡的默认构造函数,则数组将调用所有对象的默认构造函数。

我记不清具体的规则了,但是int、char*s、其成员都有平凡构造函数的结构体等等,都有平凡的默认构造函数。这些东西的数组(以及这些东西的数组的数组,等等)不会被初始化,除非你显式地这样做。

显式声明的默认构造函数绝不是微不足道的,因此数组中的Foo对象将被默认构造。