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

1 c++ constructor

www.fredosaurus.com 说明这一点:

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

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

Sto*_*ica 5

重申我的评论,该教程是错误的.对象本身的存储不是构造函数的责任.如果你看一下对象生存期的C++标准定义[basic.life]/1:

对象或引用的生命周期是对象或引用的运行时属性.如果一个对象属于类或聚合类型,并且它或其子对象之一由除了普通默认构造函数之外的构造函数初始化,则称该对象具有非空的初始化.[注意:通过简单的复制/移动构造函数进行初始化是非空的初始化. - 结束注释]类型T对象的生命周期从以下开始:

  • 获得具有适当对齐和T型尺寸的存储,并且

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

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

  1. 它可能是静态存储.所以c'tor 只能初始化对象.
  2. 它可能是自动存储,每次进入作用域时,它都是管理它的运行时,而不是c'tor.
  3. 它可以是通过动态分配获得的存储,使用operator new.同样,不是c'tor会做的事情.

构造函数总是在存储上运行(无论如何获得)以使对象在那里存在.

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

struct foo {
  std::string a;
  std::string b;
};
Run Code Online (Sandbox Code Playgroud)

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

  • @RoshanRimal - 构造函数始终初始化所有成员.问题是某些成员(如基本类型)将其默认初始化指定为给出不确定的值.这与在成员初始化列表中初始化它们不同.如果你有一个成员`int c;`并且你写了`foo():c {} {}`那么它将*zero初始化*`c`. (3认同)