隐式创建的默认构造函数是否负责分配对象内存?

时间:2017-09-24 06:03:14

标签: c++ constructor

Service声明:

  

当创建类的对象时,C ++会调用构造函数   那个班。如果没有定义构造函数,C ++将调用默认值   构造函数,为对象分配内存,但不是   初始化它。

但我认为构造函数只负责初始化数据成员。我的理解不正确吗?

1 个答案:

答案 0 :(得分:5)

重申我的评论,该教程是错误的。对象本身的存储不是构造函数的责任。如果你看一下对象生存期的{+ 3}}的C ++标准定义:

  

对象或引用的生命周期是的运行时属性   对象或参考。据说一个物体具有非空的   初始化,如果它是类或聚合类型,它或它之一   它的子对象由一个非常重要的构造函数初始化   默认构造函数。 [注意:通过简单的复制/移动进行初始化   构造函数是非空的初始化。 - 结束说明]一生   类型为T的对象在以下时间开始:

     
      
  • 获得具有适当对齐方式的存储,并获得类型T的大小

  •   
  • 如果对象具有非空的初始化,则其初始化已完成,

  •   

您将看到获取存储是对象生命周期描述中的单独项目。并且有充分的理由,因为存储可以通过多种方式获得:

  1. 可能是静态存储。所以c'tor 只能初始化对象。
  2. 它可能是自动存储,每次进入作用域时,它都是管理它的运行时,而不是c'tor。
  3. 它可以是通过动态分配获得的存储,使用operator new。再说一次,不是c'tor会做的事情。
  4. 构造函数总是在存储上运行(无论如何获得)以使对象在那里存在。

    您从网站获得的报价是错误的两倍。由于默认c'tor可以很好地初始化对象以具有有效状态。考虑一下:

    struct foo {
      std::string a;
      std::string b;
    };
    

    没有用户定义的c'tor,因此将合成编译器生成的一个。并且您可以确定它将默认将两个字符串初始化为有效状态(作为空字符串)。