析构函数
有内存申请,也就有内存释放。一般来说,需要定义拷贝构造函数的类也需要定义析构函数,不需要拷贝构造函数的类,也无须定义西沟函数。所以析构函数与拷贝构造函数是成对出现的。
析构函数既然与构造函数对应,所以它也没有返回类型,更甚的是,它连参数都没有。因为它不需要初始化工作中所传递的数据分量,它只是将成员中的一些数据指针所指向的动态内存空间释放而已。因为析构函数没有参数,所以函数形式是唯一的,没有重载的析构函数。
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout<<"A->"; }
~A(){ cout<<"<-~A"; }
};
class B
{
public:
B(){ cout<<"B->"; }
~B(){ cout<<"<-~B"; }
};
class C
{
public:
C(){ cout<<"C->"; }
~C(){ cout<<"<-~C"; }
};
void func()
{
cout<<"\nfunc: ";
A a;
cout<<"ok->";
static B b;
C c;
}
int main()
{
cout<<"main: ";
for (int i = 1; i <= 2; ++i)
{
for (int j = 1; j <= 2; ++j)
{
if (i == 2)
{
C c;
}
else
A a;
}
B b;
}
func();
func();
}
输出为:
main: A-><-~AA-><-~AB-><-~BC-><-~CC-><-~CB-><-~B
func: A->ok->B->C-><-~C<-~A
func:A->ok->C-><-~C<-~A<-~B
可以看出,析构函数总是出现在对象的生命期结束之时。静态对象在程序运行结束之时析构。
for循环中,花括号{ }中为一个周期。