析构函数
特点
1.析构函数的函数名就是在类名前面加“~”,没有返回类型也没有参数,不能重载
2.在销毁对象之前一刻自动被调用,且仅被调用一次
对象离开作用域
delete操作符
3.作用:销毁 对象的各个成员变量
4.如果一个类没有定义析构函数,那么编译器会为其提供一个默认析构函数
对基本类型的成员变量,什么也不做
对类类型的成员变量,调用相应类型的析构函数
销毁 对象的各个成员变量
5.析构函数销毁过程
(1)调用析构函数
①执行析构函数的代码
②调用成员变量的析构函数
③释放对象各成员变量所占内存空间
(2)释放整个对象所占用的内存空间
#include <iostream>
using namespace std;
class A
{
public:
A()
{}
~A()
{
cout << "A类的析构函数被调用" << endl;
}
private:
int m_ai;
};
class Human
{
public:
Human(int age=0,const char* name="wr"):m_age(age),m_name(name)
{}
~Human()
{
cout << "Human类的析构函数被调用" << endl;
}
void getinfo(/*Human* this*/)
{
cout << "姓名:" << this->m_name << ",年龄:" << this->m_age << endl;
}
private:
int m_age;
string m_name;
A m_ai;
};
int main(void)
{
Human h(22,"Tom");
h.getinfo();
cout << "------main will be over------" << endl;
return 0;
}
运行结果
什么情况下需要定义析构函数
通常情况下,若对象在其生命周期的最终时刻,并不持有任何动态分配的资源,可以不定义析构函数
但若对象在其生命周期的最终时刻,持有动态资源则必须自己定义析构函数,释放对象所持有的动态资源
析构函数的功能并不局限在释放资源上,它可以执行我们希望在对象被释放之前执行的任何操作
#include <iostream>
using namespace std;
class A
{
public:
A() : m_p(new int)
{ }
~A()
{
delete m_p;
}
private:
int m_i;
int* m_p;
};
int main( void ) {
A a; // 定义a,利用a.A()
return 0;
} // a.~A() 释放a本身所占内存空间