C++析构函数
2016-07-07 21:54
302 查看
析构函数
1.析构函数
构造函数的一个用途是自动获取资源,在构造函数中分配了资源之后,需要对应操作自动回收或释放资源。析构函数就是一个这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充。其为在类名前加一个“~”符号。在C++中“~”是取反运算符,可以看出析构函数是与构造函数作用相反的函数。其中析构函数定义如下:~类名(){...........}
2.析构函数的特定
(1)析构函数没有返回值,没有函数类型;(2) 不能被重载,只能有一个析构函数,不同于一个类可以有多个构造函数;
(3) 析构函数在声明类时候定义的,故其可以完成类设计者所指定任何指定的操作,只是希望在该类使用完毕之后执行;
(4) 由于类对象过期时析构函数将自动被调用,因此必须有一个析构函数。如果程序员没有提供,编译器会隐形地声明
一个析构函数,但其只是徒有虚名,实际上面什么操作都不进行。想让析构函数完成任何工作,都必须在定义析构函数
中指定。
3.析构函数的调用
(1)如果创建的是自动存储类对象,则析构函数将在程序执行完成代码块时(该对象是在其中定义的)自动调用。(2)如果创建的是静态存储类对象,由于该对象在函数调用结束时对象并不释放,因此也不调用析构函数。只在main函数结束或调用exit函数结束程序时,即只在程序结束时才调用static局部对象的析构函数。
(3)如果定义一个全局的对象,则在程序的流程离开其作用域时(如main函数结束或调用eixt函数),调用该全局对象的析构函数。
(4)如果该对象是通过new创建的,则它驻留在堆栈内存或自由存储区中,当使用delete来释放内存时,其析构函数会自动调用。
(5)程序可以创建临时对象来完成特定操作,程序将在结束对该对象的使用时自动调用其析构函数。
注意:
动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象析构函数,对象一直存在。从而导致内存泄漏,而且,对象内部使用的任何资源都不会释放。
当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。
4.相关程序
第一部分:#include <iostream.h> class A { public : A() { count++; } ~A() //定义析构函数 { --count; cout<<"called"<<endl; } static int num() { return count; } private : static int count; //定义静态变量 }; int A::count = 0; int main() { A x,y; cout<<"The num.is"<<A::num()<<endl; if(A::num()>1) { A x,y,z; //定义自动局部变量 cout<<"The num.is"<<A::num()<<endl; } A z; cout<<"The num.is"<<A::num()<<endl; return 0; }程序运行截图:
第二部分:
/* Jason Gel 2016-7-7 */ #include <iostream.h> class A { public : A() { count++; } ~A() //定义析构函数 { --count; cout<<"called"<<endl; } static int num() { return count; } private : static int count; //定义静态变量 }; int A::count = 0; int main() { A x,y; cout<<"The num.is"<<A::num()<<endl; if(A::num()>1) { A x,y,z; //定义自动局部变量 static A w; //定义静态局部对象 cout<<"The num.is"<<A::num()<<endl; //该语句结束后,x,y对象析构函数自动被调用,但是w对象的析构函数不被运行 } A z; cout<<"The num.is"<<A::num()<<endl; return 0; //该语句结束时,对象x,y,z,w对象的析构函数被自动运行 }程序运行截图:
附:static变量和static函数的特点
static全局变量只初始化一次,防止在其他文件单元中被引用;static局部变量只初始化一次,下一次依据上一次的结果;static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解