【发布时间】:2011-11-11 10:52:54
【问题描述】:
当我声明一个数组时,所有的变量/对象都会被声明。但是,如果它们的类有构造函数,对象会怎样呢?我正在使用的类有 2 个构造函数——一个没有参数,一个有几个参数。第一个构造函数会在声明后激活吗?或者没有构造函数会被激活?
如果发生第一种情况,我将不得不创建一个替换构造函数的函数。
那么,新声明的数组中的对象会发生什么?
【问题讨论】:
当我声明一个数组时,所有的变量/对象都会被声明。但是,如果它们的类有构造函数,对象会怎样呢?我正在使用的类有 2 个构造函数——一个没有参数,一个有几个参数。第一个构造函数会在声明后激活吗?或者没有构造函数会被激活?
如果发生第一种情况,我将不得不创建一个替换构造函数的函数。
那么,新声明的数组中的对象会发生什么?
【问题讨论】:
这取决于你如何声明数组。成员将是默认值、值或复制初始化:
Foo x[] = { Foo(1), Foo(true, 'a'), Foo() }; // copy-initialize
Foo x[3] = { }; // value-initialize
Foo x[3]; // default-initialize
对于类类型,默认和值初始化调用默认构造函数。复制初始化可以直接调用相应的构造函数。
如果您不想使用默认构造函数,则不会围绕大括号初始化器并拼出每个成员。
【讨论】:
Foo(Foo *) 构造函数,并且如果该构造函数没有 delete 其参数(这将是非常糟糕的风格),则会导致内存泄漏。
Foo x[] = { Foo(1) };。我也可以说Foo x[] = { 1 };,但这有点不同——它需要一个单参数构造函数,还需要一个隐式复制构造函数。 C++11 也允许Foo x[] = { {true, 'a'} }; 使这更加灵活,尽管我们需要一个可访问的隐式复制构造函数。
如果底层类型具有非平凡的默认构造函数,则数组将调用所有对象的默认构造函数。
我不记得确切的规则,但是 ints、char*s、其成员都具有普通构造函数的结构等,都有普通的默认构造函数。这些东西的数组(以及这些东西的数组等)不会被初始化,除非你明确地这样做。
显式声明的默认构造函数绝不是微不足道的,因此数组中的 Foo 对象将是默认构造的。
【讨论】: