C++ - 面向对象 - 析构函数

析构函数

1、基本介绍
  1. 析构函数是对象销毁时自动调用的特殊成员函数,用于释放资源

  2. 析构函数名称为 ~【类名】,无参数,无返回值

  3. 一个类只有一个析构函数,不写则编译器生成空析构函数

  4. 析构函数不要手动调用(能调用,但别这样做,会导致重复析构)

  5. 反向顺序自动析构成员变量

2、演示
cpp 复制代码
#include <iostream>

using namespace std;

class MyTest {
public:
	~MyTest() {
		cout << "释放资源" << endl;
	}
};

int main() {
	{
		MyTest mytest;
	}
	cout << "已离开作用域" << endl;

	return 0;
}
复制代码
# 输出结果

释放资源
已离开作用域
cpp 复制代码
#include <iostream>

using namespace std;

class StringBuffer {
private:
	char* data;
	size_t size;
public:
	StringBuffer(const char* str) {
		size = strlen(str);
		data = new char[size + 1];
		strcpy(data, str);
		cout << "构造: " << data << endl;
	}

	~StringBuffer() {
		cout << "析构: " << data << endl;
		delete[] data; // 释放堆内存
	}

	void print() {
		cout << "内容: " << data << endl;
	}
};

int main() {
	{
		StringBuffer sb("Hello World");
		sb.print();
	}

	cout << "已离开作用域" << endl;

	return 0;
}
复制代码
# 输出结果

构造: Hello World
内容: Hello World
析构: Hello World
已离开作用域
3、补充学习
  1. 析构函数不要手动调用
cpp 复制代码
#include <iostream>

using namespace std;

class MyTest {
public:
	~MyTest() {
		cout << "释放资源" << endl;
	}
};

int main() {
	{
		MyTest mytest;
		mytest.~MyTest();
	}
	cout << "已离开作用域" << endl;

	return 0;
}
复制代码
# 输出结果

释放资源
释放资源
已离开作用域
  1. 反向顺序自动析构成员变量
cpp 复制代码
#include <iostream>

using namespace std;

class Member {
	string name;
public:
	Member(const char* n) : name(n) {
		cout << "成员构造: " << name << endl;
	}
	~Member() {
		cout << "成员析构: " << name << endl;
	}
};

class Container {
	Member m1, m2;
public:
	Container() : m2("m2"), m1("m1") {
		cout << "容器构造" << endl;
	}
};

int main() {
	Container c;
	return 0;
}
复制代码
# 输出结果

成员构造: m1
成员构造: m2
容器构造
成员析构: m2
成员析构: m1
相关推荐
啦啦啦啦啦zzzz1 分钟前
moduo网络库 Acceptor TcpConnection
服务器·网络·c++·reactor·网络库
游戏开发爱好者81 分钟前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone
键盘会跳舞3 分钟前
C++:右值引用与移动语义源码级深度拆解——现代C++性能优化的语言基石
c++·右值引用·移动语义
SomeB1oody8 分钟前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
__zRainy__11 分钟前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
码匠许师傅12 分钟前
【C++ 面试真题】聊聊 C++ 的虚函数和多态
java·c++·面试
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
Mr. zhihao1 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
格林威1 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
djjjx.1 小时前
【 C++ 】多态
开发语言·c++·多态