您的位置:首页 > 编程语言 > C语言/C++

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函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息