📜  C++ |析构函数|问题1(1)

📅  最后修改于: 2023-12-03 15:29:52.013000             🧑  作者: Mango

C++ | 析构函数 | 问题1

什么是析构函数?

在 C++ 中,析构函数是一种特殊的成员函数,可以在对象被销毁的时候自动调用。通常在析构函数内部释放对象所持有的资源。如果一个类有析构函数,那么它就可以自动管理资源,而不需要人工干预。

析构函数的声明和定义

析构函数的声明和定义都是特殊的,需要以下几点注意:

  1. 析构函数的名称与类的名称相同,前面需要加上波浪线符号 ~
  2. 析构函数不接受任何参数,不返回任何值。
  3. 析构函数的声明和定义必须在类的结尾处。例如:
class Test {
public:
  Test(); // 默认构造函数
  Test(int data); // 带参数构造函数
  ~Test(); // 析构函数

private:
  int mData;
};

Test::Test() : mData(0) {}

Test::Test(int data) : mData(data) {}

Test::~Test() {}
析构函数的作用

一个类的析构函数在以下情况下会被自动调用:

  • 对象的生命期结束,它所在的作用域已经结束。
  • 对象被 delete 运算符删除。
  • 不再需要它所占用的临时资源,比如 auto_ptr 类型的对象,在其所在的作用域结束或者被重新赋值之前,都会自动调用析构函数释放它所管理的资源。

在析构函数内部,程序员需要完成对象的最终清理工作,比如释放对象占用的内存、关闭文件、断开网络连接等等。

常见的问题
Q1:析构函数怎么写?

A:析构函数与默认构造函数、拷贝构造函数、拷贝赋值运算符一样,是 C++ 程序默认提供的三个特殊函数之一。如果一个类不需要显示分配堆内存、打开文件、建立网络连接等操作,那么通常可以不需要写析构函数,让编译器默认提供即可。

Q2:可以不写析构函数吗?

A:可以。如果一个类没有显式动态分配内存或者使用了资源管理类(比如 auto_ptrshared_ptrunique_ptr 等),那么通常不需要写析构函数。否则,如果忘记释放内存或资源,可能会导致内存泄漏和资源浪费。

Q3:为什么析构函数的访问权限是公有的?

A:因为析构函数需要在对象生命期结束时自动调用,如果其访问权限是私有的,那么对象的销毁工作就需要其它函数或者友元帮助完成,失去了自动释放资源的便利性。

参考资料