为什么构造函数将始终具有与类相同的名称以及如何隐式调用它们?

Mic*_*per 4 c# c++ java

我想知道为什么构造函数的名称总是与类名的名称相同,以及在创建该类的对象时如何隐式调用它.任何人都可以解释这种情况下的执行流程吗?

fre*_*low 13

我想知道为什么构造函数的名称总是与类名的名称相同

因为此语法不需要任何新关键字.除此之外,没有充分的理由.

为了最大限度地减少新关键字的数量,我没有使用这样的显式语法:

class X {
    constructor();
    destructor();
}
Run Code Online (Sandbox Code Playgroud)

相反,我选择了一个声明语法来反映构造函数的使用.

class X {
    X();
    ~X();
Run Code Online (Sandbox Code Playgroud)

这可能过于聪明了.[C++的设计和演变,3.11.2构造函数表示法]


任何人都可以解释这种情况下的执行流程吗?

对象的生命周期可以总结如下:

  1. 分配内存
  2. 调用构造函数
  3. 使用对象
  4. 调用析构函数/终结符
  5. 释放记忆

在Java中,步骤1始终从堆中分配.在C#中,类也是从堆中分配的,而结构的内存已经可用(在非捕获的本地结构的情况下在堆栈中或在它们的父对象/闭包内).请注意,了解这些细节通常不是必需的或非常有用.在C++中,内存分配非常复杂,所以我不会在这里详细介绍.

第5步取决于内存的分配方式.方法结束后,堆栈存储器将自动释放.在Java和C#中,垃圾收集器在不再需要它的某个未知时间内隐式释放堆内存.在C++中,堆内存在技术上通过调用释放delete.在现代C++中,delete很少手动调用.相反,你应该使用诸如的RAII对象std::string,std::vector<T>std::shared_ptr<T>自己处理它.


Ode*_*ded 6

为什么?因为你提到的不同语言的设计师决定以这种方式制作它们.某人完全有可能设计一种OOP语言,其中构造函数不必与类具有相同的名称(如注释,python中就是这种情况).

这是区分构造函数和其他函数的简单方法,并使代码中的类构造非常易读,因此作为语言设计选择是有意义的.

这种机制在不同的语言中略有不同,但实质上这只是一种语言功能辅助的方法调用(new例如java和c#中的关键字).

每当创建新对象时,运行时都会调用构造函数.

  • 小修正:构造函数可以通过没有返回类型来伪装.实际上可以使用类名称的常规方法(至少在Java中),但由于某种原因,它"非常气馁" (2认同)