当我声明一个数组时,所有变量/对象都被声明。但是对象会发生什么,如果他们的类有构造函数?我正在使用的类有2个构造函数 - 一个没有参数,一个有一些参数。声明后第一个构造函数是否会激活?或者没有构造函数会激活?
如果第一种情况发生,我将不得不创建一个替换构造函数的函数。
那么,新声明的数组中的对象会发生什么?
答案 0 :(得分:8)
这取决于你如何声明数组。成员将是默认值,值或复制初始化:
Foo x[] = { Foo(1), Foo(true, 'a'), Foo() }; // copy-initialize
Foo x[3] = { }; // value-initialize
Foo x[3]; // default-initialize
对于类类型,default-和value-initialization调用默认构造函数。复制初始化可以直接调用适当的构造函数。
如果您不想使用默认构造函数,则不会使用大括号初始值并将每个成员拼写出来。
答案 1 :(得分:2)
如果底层类型具有非平凡的默认构造函数,则数组将调用所有对象的默认构造函数。
我不完全记得规则,但是int,char * s,其成员都具有琐碎构造函数的结构等等,都具有普通的默认构造函数。除非你明确地这样做,否则不会初始化这些东西的数组(以及这些东西的数组数组等)。
显式声明的默认构造函数永远不会是微不足道的,因此数组中的Foo对象将是默认构造的。