Why do C++ objects have a default destructor?(为什么C++对象有一个默认的析构函数?)
问题描述
例如,当我没有声明构造函数时,编译器将为我提供一个没有参数和定义(空体)的默认构造函数,因此不会采取任何操作。 那么,例如,如果我完成了一个对象,默认的析构函数不会重新分配(释放)该对象使用的内存吗?如果它没有,为什么我们会得到它?
而且,可能同样的问题也适用于默认构造函数。如果它什么也不做,为什么默认情况下会为我们创建它?
推荐答案
说编译器生成的默认构造函数不执行任何操作是错误的。它相当于一个具有空主体和空初始化器列表的用户定义构造函数,但这并不意味着它不执行任何操作。以下是它的功能:
- 它调用基类的默认构造函数。
- 如果类是多态的,则它初始化vtable指针。
- 它调用所有成员的默认构造函数。如果某个成员具有一些构造函数,但没有默认构造函数,则这是编译时错误。
只有当类不是多态的,没有基类,也没有需要构造的成员时,编译器生成的默认构造函数才不执行任何操作。但即便如此,出于其他答案中解释的原因,默认构造函数有时也是必要的。
析构函数也是如此-它调用基类的析构函数和所有拥有它们的成员的析构函数,所以在一般情况下,编译器生成的析构函数不做任何事情是不正确的。
但内存分配实际上与此无关。内存是在调用构造函数之前分配的,并且只有在最后一个析构函数完成之后才会释放。
这篇关于为什么C++对象有一个默认的析构函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么C++对象有一个默认的析构函数?
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31