我正在读书
Robert Lafore的C ++中面向对象的编程 并且提到了(第235页)
“如果没有构造函数,编译器会自动在程序中内置一个隐式无参数构造函数,而这个构造函数创建了对象,即使我们没有定义它在类中。这个无参构造函数被称为默认构造函数。如果它不是由构造函数自动创建的,那么你将无法创建没有定义构造函数的类的对象“
构造函数是否创建了对象?
我理解构造函数可用于初始化对象。但即使我不需要初始化我正在创建的类的对象,编译器也会生成一个默认构造函数。因此我怀疑构造函数还有其他用途/需求。有没有?
答案 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;这些都会调用不同的运算符/函数吗?
没有。他们都调用复制构造函数。第一个是对复制构造函数的显式调用,第二个是复制初始化。