C++从入门到精通——类的6个默认成员函数之析构函数

慈云数据 2024-05-14 技术支持 45 0

析构函数

  • 前言
  • 一、析构函数的概念
  • 二、析构函数的特性
  • 三、析构函数的练习题
  • 四、总结
    • 关于析构函数和构造函数的执行顺序

      前言

      类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。

      空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

      默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

      class Date {};
      

      在这里插入图片描述

      一、析构函数的概念

      通过前面构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?

      析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

      在C++中,析构函数是一种特殊的成员函数,用于在对象被销毁时清理其使用的资源。它的名称与类的名称相同,前面加上一个波浪线(~),没有返回类型,也不接受任何参数。

      当对象的生命周期结束时,即对象超出了其作用域,或者通过delete运算符释放了动态分配的内存,或者程序执行完成时,都会触发对象的析构函数。

      析构函数可以用于释放动态分配的内存、关闭打开的文件、释放其他资源等。它的主要作用是确保对象在被销毁之前进行必要的清理工作,以避免资源泄漏和不可预测的行为。

      二、析构函数的特性

      析构函数是特殊的成员函数,其特征如下:

      1. 析构函数名是在类名前加上字符 ~。
      2. 无参数无返回值类型。
      3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
      4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
      typedef int DataType;
      class Stack
      {
      public:
      	Stack(size_t capacity = 3)
      	{
      		_array = (DataType*)malloc(sizeof(DataType) * capacity);
      		if (NULL == _array)
      		{
      			perror("malloc申请空间失败!!!");
      			return;
      		}
      		_capacity = capacity;
      		_size = 0;
      	}
      	void Push(DataType data)
      	{
      		// CheckCapacity();
      		_array[_size] = data;
      		_size++;
      	}
      	// 其他方法...
      	~Stack()
      	{
      		if (_array)
      		{
      			free(_array);
      			_array = NULL;
      			_capacity = 0;
      			_size = 0;
      		}
      	}
      private:
      	DataType* _array;
      	int _capacity;
      	int _size;
      };
      void TestStack()
      {
      	Stack s;
      	s.Push(1);
      	s.Push(2);
      }
      
      1. 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数。跟构造函数类似,内置类型不做处理,自定义类型调用它的析构函数。
      class Time
      {
      public:
      	~Time()
      	{
      		cout 
      private:
      	// 基本类型(内置类型)
      	int _year = 1970;
      	int _month = 1;
      	int _day = 1;
      	// 自定义类型
      	Time _t;
      };
      int main()
      {
      	Date d;
      	return 0;
      }
      
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon