【问题标题】:Initializing an array of objects created on the heap初始化在堆上创建的对象数组
【发布时间】:2022-10-14 22:43:06
【问题描述】:

给定非平凡的数据结构:

claas MyClass
{
public:
  MyClass():x(0), p(nullptr)
  {}

private:
  int x;
  int* p;
};

c++ 规范是否保证将为ptr 指向的数组中的每个MyClass 实例调用默认构造函数?

主函数()
    {
      MyClass* ptr = new MyClass[5];
    }

【问题讨论】:

  • that the default constructor will be called for 你还有什么期望在这里发生的吗?
  • @sampath 是的。
  • 您也可以添加cout 并自行测试。尽管那只会向您展示而不是保证。
  • @JasonLiam 不是真的。这并不能测试标准是否能保证事情。
  • @user253751 我当然知道。

标签: c++ c++11 default-constructor default-initialization


【解决方案1】:

c++ 规范是否保证将为ptr 指向的数组中的每个MyClass 实例调用默认构造函数?

是的,它得到保证,如下所述。

来自new expression's documentation

::(optional) new new-type initializer(optional)   (2)     

new-expression 创建的对象按照以下规则进行初始化:

  • 如果输入或new-type是数组类型,一个对象数组被初始化。

    • 如果没有初始化器,则每个元素都是默认初始化的.

距离default initialization documentation 更远:

new T       (2)

默认初始化在三种情况下执行:

2) 当具有动态存储持续时间的对象由没有初始化程序的 new-expression 创建时;

而且,

默认初始化的效果是:

  • 如果T 是数组类型,则数组的每个元素都是默认初始化的;

(强调我的)

请注意最后一个声明,它说“每个元素都是默认初始化的”这意味着(在您的示例中)将按照bullet point 1 调用默认构造函数:

如果 T 是(可能是 cv 限定的)非 POD(C++11 之前)类类型,则考虑构造函数并针对空参数列表进行重载决议。调用选择的构造函数(默认构造函数之一)为新对象提供初始值;


这意味着可以保证在您的示例中调用默认构造函数。

【讨论】:

  • 如果有任何挥之不去的不确定性,default-initialize 确实意味着在这种情况下调用默认构造函数。
  • @Useless 是的,我在最后添加了一些解释,因为数组的每个元素都是默认初始化的,所以按照point 1,将调用默认构造函数。
猜你喜欢
  • 2018-04-11
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2018-06-22
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多