C++析构函数
来源:互联网 发布:汕头美工助理招聘信息 编辑:程序博客网 时间:2024/06/14 17:49
析构函数
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#)
- C++--------析构函数
- c++::析构函数
- C++-析构函数
- 构造函数和析构函数【c++】
- c++-构造函数与析构函数
- C++-构造函数,析构函数
- [c++]构造函数和析构函数
- C++--构造函数与析构函数
- 【C#】构造函数和析构函数
- 【c#】—架构函数&&析构函数
- 【C++】构造函数和析构函数
- 【C++】构造函数和析构函数
- C++(构造函数&&析构函数)
- 【C#】构造函数&析构函数
- 【c++】构造函数与析构函数
- 【C++】类构造函数 & 析构函数
- C++:构造函数和析构函数
- 与Session的亲密接触&彻底掌握Java中Session Token Cookie
- 参数传递
- 算法学习【10】寻找质因数的个数
- 使用jekyll在Github上进行博客搭建
- 【一天一道LeetCode】#141. Linked List Cycle
- C++析构函数
- java基础学习总结——GUI编程(二)
- windows下telnet的NTLM 身份验证
- 真是无语了
- ROS里基本坐标系的理解:map,odom,base_link,base_laser
- PL/SQL 程序设计简介
- linux内核中断分析
- INT 21H 指令说明及使用方法
- java -- 低级失误