2011-11-11 105 views
1

当我声明一个数组时,将声明所有变量/对象。但是,如果对象具有构造函数,那么对象会发生什么?我使用的类有2个构造函数 - 一个没有参数,一个有几个参数。声明后第一个构造函数会激活吗?或者没有构造函数会激活?C++将具有构造函数的对象添加到数组

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

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

回答

8

这取决于你如何声明数组。成员是要么默认值,或复制初始化:

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

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

如果您不想使用默认构造函数,则不会使用括号初始值设定项并拼出每个成员。

+0

你的意思是Foo x [] = {** new ** Foo(1),...}? –

+0

@ThanhNguyen:这将需要一个'Foo(Foo *)'构造函数,并且如果该构造函数不删除它的参数(这将是非常糟糕的样式),会导致内存泄漏。 –

+0

@ThanhNguyen:不,我的意思是'Foo x [] = {Foo(1)};'。我也可以说'Foo x [] = {1};',但这有点不同 - 它需要一个参数的构造函数,并且还需要一个隐式拷贝构造函数。 C++ 11通过允许'Foo x [] = {{true,'a'}};'使得这个更灵活一点,尽管我们需要一个可访问的隐式拷贝构造函数。 –

2

如果基础类型有一个不平凡的默认构造函数,数组将调用所有对象的默认构造函数。

我完全不记得规则,但ints,char * s,结构的成员都有微不足道的构造函数等等,都有简单的默认构造函数。除非明确这样做,否则这些东西(以及这些东西的数组阵列等)数组将不会被初始化。

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

+0

我认为你指的是最后一段基本类型的默认初始化,这确实会使变量未初始化。 –

+0

@KerrekSB:不,不只是基本类型。结构,联合,结构数组的结构等都可以使用简单的默认构造函数。 –

+0

是的,的确,这适用于这些事情的结构和数组递归递归! –

相关问题