我想知道为什么构造函数的名称总是与类名的名称相同,以及在创建该类的对象时如何隐式调用它.任何人都可以解释这种情况下的执行流程吗?
fre*_*low 13
我想知道为什么构造函数的名称总是与类名的名称相同
因为此语法不需要任何新关键字.除此之外,没有充分的理由.
为了最大限度地减少新关键字的数量,我没有使用这样的显式语法:
Run Code Online (Sandbox Code Playgroud)class X { constructor(); destructor(); }相反,我选择了一个声明语法来反映构造函数的使用.
Run Code Online (Sandbox Code Playgroud)class X { X(); ~X();这可能过于聪明了.[C++的设计和演变,3.11.2构造函数表示法]
任何人都可以解释这种情况下的执行流程吗?
对象的生命周期可以总结如下:
在Java中,步骤1始终从堆中分配.在C#中,类也是从堆中分配的,而结构的内存已经可用(在非捕获的本地结构的情况下在堆栈中或在它们的父对象/闭包内).请注意,了解这些细节通常不是必需的或非常有用.在C++中,内存分配非常复杂,所以我不会在这里详细介绍.
第5步取决于内存的分配方式.方法结束后,堆栈存储器将自动释放.在Java和C#中,垃圾收集器在不再需要它的某个未知时间内隐式释放堆内存.在C++中,堆内存在技术上通过调用释放delete.在现代C++中,delete很少手动调用.相反,你应该使用诸如的RAII对象std::string,std::vector<T>并std::shared_ptr<T>自己处理它.
为什么?因为你提到的不同语言的设计师决定以这种方式制作它们.某人完全有可能设计一种OOP语言,其中构造函数不必与类具有相同的名称(如注释,python中就是这种情况).
这是区分构造函数和其他函数的简单方法,并使代码中的类构造非常易读,因此作为语言设计选择是有意义的.
这种机制在不同的语言中略有不同,但实质上这只是一种语言功能辅助的方法调用(new例如java和c#中的关键字).
每当创建新对象时,运行时都会调用构造函数.