C++之“析构函数”

文章目录

析构函数的概念

析构函数与构造函数功能相反,析构函数类似于Destroy的功能。

在此,不要搞混了析构函数的功能,它不是用来销毁对象本身的。因为局部对象储存在栈帧里,函数结束时,栈帧就销毁了,存在在栈帧里的对象也就被释放了,不需要我们去释放。C++规定对象在销毁时 会自动调用析构函数,完成对象中资源的清理释放工作。

严格来说,Data类的是不需要析构函数的【它没有资源需要清理】,栈才需要。简单理解的话就是,一般情况下,显示申请了资源(也可以说是开空间,比如:栈)才需要自己实现析构,其余情况不需要显示写。

析构函数的特点

  1. 析构函数名:在类名前面加~。 (~在C语言中有按位取反的意思)
  2. 无参数无返回值。(同样析构函数不需要写void)(无参数意味着析构函数没有函数重载)
  3. 一个类只有一个析构函数(和无参有关)。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,系统自动调用析构函数。
  5. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数
    还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况都会自动调用析构函数。
cpp 复制代码
#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:
	//构造函数
	Stack(int n = 4)
	{
		_a = (STDataType*)malloc(sizeof(STDataType) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_top = 0;
	}
	//析构函数
	~Stack()
	{
		cout << "~Stack()" << endl;//没有任何作用,这样只是为了能让我们知道调用了析构函数
		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}

private:
	STDataType* _a;
	size_t _capacity;
	size_t _top;
};

class MyQueue
{
public:
private:
	Stack pushst;  //这个是上面我们自定义类型Stack
	               //编译器默认⽣成MyQueue的析构函数调⽤了Stack的析构,释放的Stack内部的资源
	               // 显⽰写析构,也会⾃动调⽤Stack的析构
                   //~MyQueue(){}
	Stack popst;
};

int main()
{
	Stack st;
	return 0;
}
  1. 是否写析构函数:
  • 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如Date;它的里面只有一些变量

  • 如果默认生成的析构就可以用,也就不需要显示写析构,如MyQueue;它会调Stack的析构

  • 但是有资源申请时,一定要自己写析构,否则会造成资源泄漏,如Stack中malloc了空间。

  1. 一个局部域的多个对象,C++规定后定义的,需要先析构

C++和C对比(之前的两个栈实现一个队列)

不会再忘记调用Init和Destory函数了

相关推荐
朝朝辞暮i4 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
小师兄吃牛肉5 小时前
C语言篇:宏
c语言·开发语言
郑同学的笔记5 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
随意起个昵称6 小时前
【背包dp】输出方案路径
c++·动态规划
言乐66 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_307779136 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
kakakahahahaha6 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i6 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
by209996 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
沙漠之主6 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++