Why do C++ objects have a default destructor?(为什么C++对象有一个默认的析构函数?)
问题描述
例如,当我没有声明构造函数时,编译器将为我提供一个没有参数和定义(空体)的默认构造函数,因此不会采取任何操作。 那么,例如,如果我完成了一个对象,默认的析构函数不会重新分配(释放)该对象使用的内存吗?如果它没有,为什么我们会得到它?
而且,可能同样的问题也适用于默认构造函数。如果它什么也不做,为什么默认情况下会为我们创建它?
推荐答案
说编译器生成的默认构造函数不执行任何操作是错误的。它相当于一个具有空主体和空初始化器列表的用户定义构造函数,但这并不意味着它不执行任何操作。以下是它的功能:
- 它调用基类的默认构造函数。
- 如果类是多态的,则它初始化vtable指针。
- 它调用所有成员的默认构造函数。如果某个成员具有一些构造函数,但没有默认构造函数,则这是编译时错误。
只有当类不是多态的,没有基类,也没有需要构造的成员时,编译器生成的默认构造函数才不执行任何操作。但即便如此,出于其他答案中解释的原因,默认构造函数有时也是必要的。
析构函数也是如此-它调用基类的析构函数和所有拥有它们的成员的析构函数,所以在一般情况下,编译器生成的析构函数不做任何事情是不正确的。
但内存分配实际上与此无关。内存是在调用构造函数之前分配的,并且只有在最后一个析构函数完成之后才会释放。
这篇关于为什么C++对象有一个默认的析构函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么C++对象有一个默认的析构函数?


基础教程推荐
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 常量变量在标题中不起作用 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01