【问题标题】:C++ Adding objects that have constructors to an arrayC ++将具有构造函数的对象添加到数组
【发布时间】:2011-11-11 10:52:54
【问题描述】:

当我声明一个数组时,所有的变量/对象都会被声明。但是,如果它们的类有构造函数,对象会怎样呢?我正在使用的类有 2 个构造函数——一个没有参数,一个有几个参数。第一个构造函数会在声明后激活吗?或者没有构造函数会被激活?

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

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

【问题讨论】:

    标签: c++ arrays object


    【解决方案1】:

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

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

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

    如果您不想使用默认构造函数,则不会围绕大括号初始化器并拼出每个成员。

    【讨论】:

    • 你的意思是 Foo x[] = { new Foo(1), ...} ?
    • @ThanhNguyen:这将需要 Foo(Foo *) 构造函数,并且如果该构造函数没有 delete 其参数(这将是非常糟糕的风格),则会导致内存泄漏。
    • @ThanhNguyen:不,我的意思是Foo x[] = { Foo(1) };。我也可以说Foo x[] = { 1 };,但这有点不同——它需要一个单参数构造函数,还需要一个隐式复制构造函数。 C++11 也允许Foo x[] = { {true, 'a'} }; 使这更加灵活,尽管我们需要一个可访问的隐式复制构造函数。
    【解决方案2】:

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

    我不记得确切的规则,但是 ints、char*s、其成员都具有普通构造函数的结构等,都有普通的默认构造函数。这些东西的数组(以及这些东西的数组等)不会被初始化,除非你明确地这样做。

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

    【讨论】:

    • 我认为您在最后一段中指的是基本类型的默认初始化,这确实使变量未初始化。
    • @KerrekSB:不,不仅仅是基本类型。结构体、联合体、结构体数组的结构体等,都可以有微不足道的默认构造函数。
    • 是的,确实,这递归地适用于那些东西的结构和数组!
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2013-07-09
    • 2017-04-25
    • 2021-12-20
    • 2021-05-16
    相关资源
    最近更新 更多