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

时间:2016-02-26 09:37:55

标签: c++ constructor default-constructor

我正在读书

Robert Lafore的C ++中面向对象的编程 并且提到了(第235页)

“如果没有构造函数,编译器会自动在程序中内置一个隐式无参数构造函数,而这个构造函数创建了对象,即使我们没有定义它在类中。这个无参构造函数被称为默认构造函数。如果它不是由构造函数自动创建的,那么你将无法创建没有定义构造函数的类的对象

构造函数是否创建了对象?

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

2 个答案:

答案 0 :(得分:7)

  

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

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

  

因此我怀疑构造函数还有其他用途/需要。有没有?

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

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
}

当没有为类定义构造函数时,成员将保留default initialized,对于基元将是未定义的(垃圾),对于自定义类型的对象,将调用它们各自的默认构造函数,这可能是也可能是不初始化对象。这种行为是编译器提供的默认构造函数(称为trivial default constructor)展示的内容:它只是在名称中,但没有做任何事情。

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

有些人可能会认为构造函数对于初始化程序来说是个用词不当,而且它们部分正确。然而,语言的创建者也是部分正确的,因为从原始位(内存)开始,只有在构造函数通过之后,对象的概念才会存在;它通过将状态设置为某些有效值来从原始内存构造对象,以给出连贯对象的概念。

答案 1 :(得分:3)

  

构造函数是否创建了对象?

创建对象时,有两件事情已经完成。

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

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

Classname instance;

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

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

  

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

正如您所提到的,使用构造函数将对象初始化为有效状态。

  

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

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

  

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

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

  

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

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