C++析构函数

析构函数

特点

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本身所占内存空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值