C++入门之一【类:析构函数)】
2016-06-10 23:08
169 查看
定义: 当一个对象的生命周期结束时,系统会自动调用一个成员函数,它没有返回值,没有参数,不能重载,这个函
数就是析构函数。是特殊的成员函数。
函数名是类名前面加上一个“~”符号,功能与构造函数相反。
调用析构函数的次序正好与调用构造函数的次序相反。
特征:
1、在类名加上字符~
2、无参数,无返回值
3、一个类只有一个析构函数(所以不能重载)
4、对象生命周期结束时,系统会自动调用析构函数
5、注意:析构函数体内并不是删除对象,而是做一些清理工作。
对于对象生命周期结束的几种情况:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前
自动执行析构函数。
②static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束
程序时,才调用static局部对象的析构函数。
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全 局对
象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
析构函数的作用
在撤销对象占用的内存空间之前完成一些清理工作,使这部分内存空间可以分配给新的对象使用。
举例:
实际上,析构函数除了释放资源的作用外,还可以用来执行“用户希望在最后一次使用对象后的一些操作”。
数就是析构函数。是特殊的成员函数。
函数名是类名前面加上一个“~”符号,功能与构造函数相反。
调用析构函数的次序正好与调用构造函数的次序相反。
特征:
1、在类名加上字符~
2、无参数,无返回值
3、一个类只有一个析构函数(所以不能重载)
4、对象生命周期结束时,系统会自动调用析构函数
5、注意:析构函数体内并不是删除对象,而是做一些清理工作。
对于对象生命周期结束的几种情况:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前
自动执行析构函数。
②static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束
程序时,才调用static局部对象的析构函数。
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全 局对
象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
析构函数的作用
在撤销对象占用的内存空间之前完成一些清理工作,使这部分内存空间可以分配给新的对象使用。
举例:
class A { public: A() { p = new char[10]; } ~A() { cout<<" ~A() "<<endl; delete []p; p=NULL; } void display() { cout<<"disp"<<endl; } private: char *p; }; //测试 void main() { A a; a.~A(); a.display(); }
实际上,析构函数除了释放资源的作用外,还可以用来执行“用户希望在最后一次使用对象后的一些操作”。
相关文章推荐
- Leetcode_c++: Triangle (120)
- c语言:递归求最大公约数
- VC++6.0玩OpenGL(一)
- Leetcode_c++: Pascal's TriangleII (119)
- C++操作符函数
- 找出字符串中的所有数字字符串(C/C++实现)
- Leetcode_c++: Pascal's Triangle(118)
- C++中的const用法
- Leetcode_c++:Construct Binary Tree from Inorder and Postorder Traversal (106)
- SCPPO(三):禅道的使用—项目管理员、开发等人员
- 指针和引用
- win7旗舰版安装VC++6.0番茄插件和行号显示
- C++ 删除指定路径文件夹
- C语言选择排序详解及其实现
- C++解压zip文件
- C++11中的std::bind
- SCPPO(二):禅道的使用—管理员
- 【C语言】15-预处理指令1-宏定义
- C++中常用的STL 函数
- C++11多线程之yield