构造函数是否创建类的对象

Does the constructor creates objects of a class?

本文关键字:对象 创建 是否 构造函数      更新时间:2023-10-16

我在读

《面向对象编程C++》,作者:Robert Lafore并被提及(第235页)

"如果没有构造函数,

编译器会自动将隐式无参数构造函数内置到程序中,并且正是这个构造函数创建了对象,即使我们没有在类中定义它。此无参数构造函数称为默认构造函数。如果构造函数不是自动创建的,您将无法创建未定义构造函数的类的对象

构造函数是否创建对象?

我知道构造函数可用于初始化对象。但是,即使我不需要初始化我正在创建的类的对象,编译器也会生成一个默认构造函数。因此,我怀疑构造函数还有其他用途/需求。有吗?

构造函数是否创建类的对象?

不,它只是将类的成员初始化为某种有效的初始状态。 为对象分配空间不是它的职责。

因此,我怀疑构造函数还有其他用途/需求。有吗?

不,类可以在没有任何构造函数的情况下存在;即使没有编译器提供的构造函数。一个例子(住在这里):

struct A {
    A() = delete;  // prevent the compiler-provided default constructor
    int x;
};
int main() {
    A a = {1};     //    OK: aggregate initialization
    A b;           // Error: use of deleted function
}

当没有为类定义构造函数时,成员将保留默认初始化状态,对于基元,这将未定义(垃圾),对于自定义类型的对象,将调用其各自的默认构造函数,这些构造函数可能会也可能不会初始化对象。这种行为是编译器提供的默认构造函数(称为普通默认构造函数)所表现出的:它只是名义上存在,但不执行任何操作。

但是,我们不是说该类没有构造函数,而是说它有一个默认构造函数,这不应与用户提供的默认构造函数混淆,后者可以执行正确的初始化。请记住,默认构造函数只是一个构造函数,可以使用零参数调用,无论是否由用户提供。

有些人可能认为构造函数初始值设定项的误称,他们部分是正确的。然而,语言的创造者也有一部分是正确的,因为从原始位(内存)开始,对象的概念只有在构造函数完成它之后才会存在;它通过将其状态设置为一些有效值来从原始内存构造对象,以给出连贯对象的概念。

构造函数是否创建对象?

创建对象时会执行 2 项操作。

  • 为对象分配内存
  • 对象的初始化。

说构造函数创建对象有点误导。对构造函数的调用只是执行初始化部分。例如,当您定义自动变量时:

Classname instance;
编译器负责在

输入对象的块时为其分配内存,并在执行到达变量的声明时调用构造函数。

从技术上讲,如果类型为"普通旧数据",为对象分配空间就足够了,但在C++中强烈建议使用构造函数进行初始化。

因此,我怀疑构造函数还有其他用途/需求。

如前所述,构造函数的使用是将对象初始化为有效状态。

但是当我使用复制赋值时,没有构造函数会被称为对吗?

使用复制赋值时不使用构造函数。但是,当您使用复制赋值时,您分配给的对象已经创建,并且发生这种情况时调用了构造函数。

对于A类,A A;A b=a;...在这种情况下,构造函数会被调用多少次?

两次。 A a 此处使用默认构造函数。 A b=a 此处使用复制构造函数。 b已初始化副本。此示例中没有复制分配。

A b

(a); 和 A b = a;它们都调用不同的运算符/函数吗?

不。它们都调用复制构造函数。第一个是对复制构造函数的显式调用,第二个是复制初始化。