为什么不能在没有构造函数的情况下创建对象?

pas*_*sha -1 c++ constructor

为什么创建对象需要构造函数?即使我没有定义构造函数,也会生成默认构造函数..但为什么构造函数必需?

Dav*_*eas 8

为什么不能在没有构造函数的情况下创建对象?

这更多是关于术语的讨论,而不是关于行为的真实论证.正如你所提到的,在某些情况下,在构造过程中没有什么可做的,所以不需要构造函数,对吧?嗯,有一个简单构造函数的概念,它是一个根本不做任何事情的构造函数.为了标准文档,更容易将所有内容视为具有(可能是微不足道的)构造函数,而不是必须在其当前仅表示"构造函数"的所有位置提供所有情况和异常.

考虑到'构造函数'的每次使用都必须由'构造函数替换,如果类型没有任何虚函数或基础,则没有任何内容,并且没有需要生成构造函数的成员'.

这就是为什么所有虚函数都被称为覆盖的原因,即使是层次结构中的第一个虚拟函数,根据定义也不会覆盖任何东西.这种泛化形式使得语言稍微容易理解,尽管没有太多人会声称初始化的第8.5节很简单......

另请注意,虽然根据定义所有用户定义的类型都具有构造函数,但创建对象不需要构造函数.特别是对于具有普通构造函数的对象,生命周期在分配对象的内存时开始(标准,知道无关紧要意味着什么都不做,甚至没有经过要求在这种情况下运行构造函数的跳跃.


3.8 [basic.life]/1

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

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

- 如果对象具有非平凡的初始化,则其初始化完成.

第二个子弹用于读取(C++ 03):如果T是具有非平凡构造函数(12.1)的类类型,则构造函数调用已完成.更清楚地说明构造函数不需要执行.但新措辞以基本相同的方式表达了意图.只有当对象具有非平凡的初始化时,才需要完成初始化.对于具有普通构造函数的对象(普通初始化),分配存储会创建对象.哪里重要?

struct T { int x; }; // implicitly defined trivial-constructor
T *p = static_cast<T*>(malloc(sizeof *p));

// *p is alive at this point, no need to do
T *q;
{ void *tmp = malloc(sizeof T);
  q = new (tmp) T;              // call constructor
}
Run Code Online (Sandbox Code Playgroud)