- 析构函数:在类中声明的一种成员函数
①析构函数与类名同名
②析构函数无参(不可重载)
③表示:
~类名()
{
析构函数体;
}
-
调用:i:析构函数由系统自动调用
——释放一个对象时,系统将自动地为该对象调用析构函数
ii:目的:进行一些与该对象有关的销毁性工作
iii:用new分配的动态对象在释放时,系统要为该动态对象调用析构函数 -
局部对象:在函数内用类名定义的对象
全局对象:在函数外用类名定义的对象
i:局部对象在函数运行完成时要释放
全局对象在整个程序执行完成后释放
ii:全局对象在编译阶段即分配单元
对象的释放顺序严格与定义顺序相反(即析构函数的调用顺序严格与构造函数相反)
#include<iostream>
using namespace std;
class Myclass{
public:
Myclass(){
cout<<"Myclass conts"<<endl;
}
~Myclass()
{
cout<<"Myclass Dels"<<endl;
}
};
Myclass myGlobal;
int main()
{
Myclass my1,my2;
Myclass *Pmy=new Myclass();
delete Pmy;
}
类内new在类内delete
#include<iostream>
using namespace std;
class Myclass{
private:
int *px;
public:
Myclass(){
px=new int(3);
}
void Print()
{
cout<<*px<<endl;
}
~Myclass()
{
delete px;
}
};
int main()
{
Myclass my;
my.Print();
}
若在类中未定义析构函数,系统会自动生成一个空析构函数,以保证释放对象时可以调用
客户端new的对象,一定可以在客户端delete
#include<iostream>
using namespace std;
class Myclass{
private:
int *px;
public:
Myclass( int *t)
{
px=t;
}
void Print()
{
cout<<*px<<endl;
}
~Myclass()
{
delete px;
}
};
int main()
{
Myclass *pmy=new Myclass(new int(3));
pmy->Print();
delete pmy;
}