1,对象的销毁:
1,生活中的对象都是被初始化后才上市的;
1,为了引入生活中初始化的过程,我们引入了构造函数的概念;
2,生活中的对象被销毁前会做一些清理工作;
1,生活中手机在回收机构被拆卸,之后将能复用的材料运回工厂再加工利用;
3,C++ 中如何清理需要销毁的对象?
2,一般而言,需要销毁的对象都应该做清理,解决方案:
1,为每一个类都提供一个 public 的 free 函数;
2,对象不再需要时立即调用 free 函数进行清理;
3,代码示例:
1 class Test 2 { 3 Int* p; 4 public: 5 Test() { p = new int; } 6 void free() { delete p; 7 };
3,IntArray 使用分析实例分析:
1,见“C++学习笔记”系列博客中“C++中的深拷贝和浅拷贝构造函数”第9条目中的内容;
2,未有定义析构函数,只是一个 free() 函数,会造成本文中的问题;
4,存在的问题:
1,free 只是一个普通的函数,必须显示的调用;
2,对象销毁前没有做清理,很可能造成资源泄漏;
1,很可能会造成软件长时间运行的不稳定;
3,C++ 编译器是否能够自动调用某个特殊的函数进行对象的清理?
5,析构函数:
1,C++ 的类中可以定义一个特殊的清理函数;
1,这个特殊的清理函数叫做析构函数;
2,析构函数的功能与构造函数相反;
2,定义:~ClassName()(这个特殊的符号是取反的意思)
1,析构函数没有参数也没有返回值类型声明;
1,析构函数是不能重载的,因为重载需要参数列表不同;
2,只剩下函数体可以利用;
2,析构函数在对象销毁时自动被调用;
6,析构函数使用初探编程实验:
1 #include <stdio.h> 2 3 class Test 4 { 5 int mi; 6 public: 7 Test(int i) 8 { 9 mi = i; 10 printf("Test(): %d ", mi); 11 } 12 13 ~Test() 14 { 15 printf("~Test(): %d ", mi); 16 } 17 }; 18 19 int main() 20 { 21 Test t(1); // 这里被创建,促进构造函数语句的打印,到 return 之前时,局部变量就会被销毁,此时析构函数被自动调用; 22 23 Test* pt = new Test(2); // 堆空间上定义对象,调用构造函数; 24 25 delete pt; // 删除指针的同时销毁堆空间对象,此时会调用析构函数; 26 27 return 0; // 在此语句之前,调用 t 对象析构函数; 28 }
7,IntArray 类的进化编程实验:
1,将 free() 函数换为析构函数来实现;
2,析构函数只是自动调用并做一些简单的析构,对于系统资源的析构,还是要手动进行;
8,析构函数的定义准则:
1,当类中自定义了构造函数,并且构造函数中使用了系统资源(如:内存申请,文件打开等),则需要自定义析构函数;
1,自定义了构造函数,多半要自定义析构函数,因为自定义构造函数多半会申请系统资源;
2,析构函数完成的工作有:
1,归还内存;
2,关闭文件等;
9,小结:
1,析构函数是对象销毁时进行清理的特殊函数;
2,析构函数在对象销毁时自动被调用;
3,析构函数是对象释放系统资源的保障;
1,使编写的软件更加稳定;