首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隐式创建的默认构造函数是否负责分配对象内存?

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

Stack Overflow用户
提问于 2017-09-24 06:03:13
回答 1查看 387关注 0票数 1

www.fredosaurus.com指出:

创建类的对象时,C++调用该类的构造函数。如果未定义构造函数,C++将调用默认构造函数,该构造函数为对象分配内存,但不对其进行初始化。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-24 06:16:10

重申我的意见,该教程是错误的。对象本身的存储不是构造函数的责任。如果您查看对象生存期的C++标准定义,[basic.life]/1

对象或引用的生存期是对象或引用的运行时属性。如果一个对象是一个类或聚合类型,并且它或它的一个子对象由一个构造函数初始化,而不是一个普通的默认构造函数,则该对象被称为非空初始化。 注意:由简单的复制/移动构造函数初始化是非空初始化。 - 结束注意 类型的对象的生存期从以下时间开始:

  • 获得了适合T型的存储器,并得到了适当的对齐方式和尺寸,
  • 如果对象具有非空初始化,则其初始化完成,

您将看到,获取存储是对象生存期描述中的一个单独项。而且有一个很好的理由,因为可以通过多种方式获得存储:

  1. 可能是静态存储。因此,c‘’tor只能对对象进行初始化。
  2. 它可能是自动存储,每次输入作用域时,管理它的还是运行时,而不是c‘’tor。
  3. 它可以通过动态分配获得存储,使用operator new。再说一次,这是不可能的事。

构造函数总是在存储(无论如何获得)上操作,以使一个对象在那里出现。

你从网站上得到的报价是错误的。因为默认的c‘to可以很好地初始化对象,使其具有有效状态。考虑到这一点:

代码语言:javascript
运行
复制
struct foo {
  std::string a;
  std::string b;
};

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46387101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档