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

Does the constructor creates objects of a class?

我在读书

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

"If there was no constructor, an implicit no-argument constructor is built into the program automatically by the compiler, and it’s this constructor that created the objects, even though we didn’t define it in the class. This no-argument constructor is called the default constructor. If it weren’t created automatically by the constructor, you wouldn’t be able to create objects of a class for which no constructor was defined."

构造函数是否创建对象?

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

Does the constructor creates the object?

创建对象时会完成两件事。

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

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

Classname instance;

编译器会在进入对象块时负责为对象分配内存,并在执行到变量声明时调用构造函数。

从技术上讲,如果类型是"Plain Old Data",为对象分配space就足够了,但是在C++中强烈建议使用构造函数进行初始化.

Therefore I suspect there is some other use/need of a constructor.

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

But when I'm using copy assignment, no constructor would be called right?

使用复制赋值时不使用构造函数。但是当你使用复制赋值时,你赋值的对象已经被创建并且构造函数在发生时被调用。

For a class A, A a; A b=a;...How many times would be the constructor called in this case?

两次。 A a 这里使用了默认的构造函数。 A b=a 这里使用了拷贝构造函数。 b 已初始化副本。本例中没有复制赋值。

A b(a); and A b = a; do these both call different operators/functions?

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

Does the constructor creates objects of a class?

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

Therefore I suspect there is some other use/need of a constructor. Is there any?

不,classes 可以在没有任何构造函数的情况下存在;即使没有编译器提供一个。一个例子(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
}

当没有为 class 定义构造函数时,成员将被保留 default initialized, which for primitives would be undefined (garbage) and for objects of a custom type would be to call their respective default constructors which may or may not initialize the object. This behaviour is what the compiler-provided default constructor (called a trivial default constructor) 显示:它只是名义上的,但没有做任何事情。

然而,我们没有说 class 没有构造函数,而是说它有一个默认构造函数,不应将其与用户提供的可以进行适当初始化的默认构造函数混淆。请记住,默认构造函数只是一个可以用零参数调用的构造函数,无论用户是否提供。

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