Why do C++ objects have a default destructor?(为什么C++对象有一个默认的析构函数?)
问题描述
例如,当我没有声明构造函数时,编译器将为我提供一个没有参数和定义(空体)的默认构造函数,因此不会采取任何操作。 那么,例如,如果我完成了一个对象,默认的析构函数不会重新分配(释放)该对象使用的内存吗?如果它没有,为什么我们会得到它?
而且,可能同样的问题也适用于默认构造函数。如果它什么也不做,为什么默认情况下会为我们创建它?
推荐答案
说编译器生成的默认构造函数不执行任何操作是错误的。它相当于一个具有空主体和空初始化器列表的用户定义构造函数,但这并不意味着它不执行任何操作。以下是它的功能:
- 它调用基类的默认构造函数。
- 如果类是多态的,则它初始化vtable指针。
- 它调用所有成员的默认构造函数。如果某个成员具有一些构造函数,但没有默认构造函数,则这是编译时错误。
只有当类不是多态的,没有基类,也没有需要构造的成员时,编译器生成的默认构造函数才不执行任何操作。但即便如此,出于其他答案中解释的原因,默认构造函数有时也是必要的。
析构函数也是如此-它调用基类的析构函数和所有拥有它们的成员的析构函数,所以在一般情况下,编译器生成的析构函数不做任何事情是不正确的。
但内存分配实际上与此无关。内存是在调用构造函数之前分配的,并且只有在最后一个析构函数完成之后才会释放。
这篇关于为什么C++对象有一个默认的析构函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么C++对象有一个默认的析构函数?
- 如何提取 __VA_ARGS__? 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- GDB 不显示函数名 2022-01-01
- XML Schema 到 C++ 类 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- DoEvents 等效于 C++? 2021-01-01