- 析构函数是与类同名的另外一个特殊成员函数,作用与构造函数相反,用于对象生存期结束时,完成对象的清理工作
- 析构函数的名字是: ~ 类名
cpp
class X{
public:
X(){}
~X(){} //析构函数
};
- 析构函数的特点:
- 无参无返回值
- 不能重载
- 只能由系统调用,不能显示调用
- 栈对象,离开其作用域时析构函数自动调用
- 堆对象,执行delete操作时析构函数自动调用
cpp
#include <iostream>
using namespace std;
class Integer{
public:
Integer(int i=0){
m_pi = new int(i);
}
~Integer(void){
cout << "析构函数" << endl;
delete m_pi;
}
void print(void) const{
cout <<*m_pi << endl;
}
private:
int *m_pi;
};
int main(void){
if(1){
Integer i(100);
i.print();
cout << "test1" << endl;
Integer *pi = new Integer(200);
pi->print();
delete pi; //析构函数被调用
cout << "test2 " << endl;
}// i 的生命周期结束 对应的析构函数被调用
cout << "test3" << endl;
return 0;
}
- 缺省虚构函数:
- 如果类没有显式定义析构函数,那么编译器会为其提供一个缺省析构函数,缺省析构的函数体为空,在空析构函数体执行完毕后,类中的成员会被自动销毁
- 对基本类型成员变量,什么也不做
- 对类类型成员变量(成员子对象),将会自动调用相应类的析构函数
cpp
#include <iostream>
using namespace std;
class A{
public:
A(void){
cout << "A(void)" << endl;
}
~A(void){
cout <<"~A(void)" << endl;
}
};
class B{
public:
B(void){
cout << "B(void)" << endl;
}
~B(void){
cout << "~B(void)" << endl;
}
A m_a; // 成员子对象
};
int main(void){
B b;
return 0;
}
- 对象的创建过程:
- 分配内存
- 构造成员对象
- 调用构造函数
- 对象销毁过程:
- 调用析构函数
- 析构成员对象
- 释放内存