C++ 构造函数内部会发生什么?

Ant*_*osa 0 c++ constructor allocation

我想知道在 C++ 中调用类的构造函数时会发生什么。更具体地说,调用了哪些其他函数以及如何调用。是调用某个内置函数在栈上构造对象,还是调用malloc在堆上构造对象new?是否有使用的默认分配器?

一般来说,是否可以在不调用构造函数的情况下使用类和对象?

编辑:一个可能有助于我试图解决的好问题是:为什么构造函数不返回任何东西?最初,我认为新手程序员会期望构造函数返回对象,但事实并非如此。会发生什么?

Hol*_*Cat 5

在 C++ 中调用类的构造函数时会发生什么。更具体地说,其他函数被称为什么

类成员被初始化。如果某些成员是类实例,则调用它们的构造函数。

如果有的话,还会调用基类的构造函数。

它是否调用一些内置函数在堆栈上构造对象,或者调用malloc在堆上构造它(如果new使用)

为类实例分配内存不是构造函数的工作。调用者这样做。

例如,如果您使用new-expression,它会分配内存(通过operator new),然后在该内存上调用构造函数。

是否可以在不调用构造函数的情况下使用类和对象?

使用聚合初始化创建类实例不会调用构造函数。

您也可以使用类而不创建对象(即与静态成员交互)。


编辑:为什么构造函数不返回任何内容?

构造函数有效地接收一个地址,并在该地址构造一个实例。它不需要返回该地址,因为它是由调用者首先提供的。

这就是 C++ 的工作原理。

不然还能怎样呢?假设您想从构造函数返回一个对象。这是否意味着在构造函数中分配临时存储,在其中构造一个对象,然后让调用者从该存储中复制该对象?这需要有一个工作复制构造函数。那么复制构造函数本身是如何实现的呢?


use*_*342 5

为什么构造函数不返回任何东西?

构造函数不返回对象,它在一块内存上构造对象,并且不管内存是如何分配的。如果您将完成的对象视为建筑物,那么构造函数就是在给定的一块土地上建造建筑物的功能。购买土地不是建造者的工作,而只是在其上建造(建造)。

返回对象的构造函数将无法构造分配在堆栈上或嵌入其他对象中的对象。相反,分配和构造是解耦的,构造函数有效地接收指向它应该处理的内存的this指针(作为指针公开)。这样,相同的构造函数适用于堆栈和堆分配的对象。