c++学习——前进(三)

48 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天

三:析构函数

析构函数也是成员函数的一种,它的名字和类名相同,类名前面要加一个字符“~”,用于区分构造函数。析构函数没有参数也没有返回值,一个类中有且仅有一个析构函数。若程序中没有定义析构函数,编辑器会自动生成一个函数体为空的默认析构函数, 它的作用是在对象销毁之前,做一个清理善后的工作,保证空间的可利用性。

析构函数会在对象销毁时被调用,举个简单的例子:

# include <iostream>
using namespace std;
class Deom
{
	public:
		~Deom()
		{
			cout<<"调用析构函数"<<endl;
		}
};
int main()
{
	{
		Deom deo;
	}//局部变量在超出局部作用域后对象销毁,这时调用析构函数 
	cout<<"调用完毕"<<endl;
}

图片.png

当使用new运算符生成对象指针时,编辑器会自动调用本类的析构函数;使用delete删除这个对象时,首先为这个动态对象调用本类的析构函数,然后再释放占用的空间。

using namespace std;
class A
{
	public:
		A()
	{	
		cout<<"A的构造函数"	<<endl; 
	}
		~A()
	{
		cout<<"A的析构函数"<<endl;
	}
};
class B
{
	A *a;//在B中定义一个指针 
	public:
		B()
	{
		cout<<"B的构造函数"<<endl;
		a=new A;//指针指向堆区空间 ,使用new生成对象指针时,自动调用本类的构造函数 
	}
		~B()
	{
		cout<<"B的析构函数" <<endl;
		delete a;//使用关键字new 创建的对象,用delete来撤销 ;使用delete删除这个对象时,首先调用本类的析构函数,再释放占用的内存。 
	}
}; 
int main()
{
	B b;//B的对象b定义在栈区,出栈之后自动调用本类的析构函数 
	return 0;
}

图片.png

假如将“delete a;”注释掉,那么就会出现内存泄露的情况,而析构函数可以清理类中有指针、并且指向堆区空间的成员,释放指针指向的堆区空间,防止内存泄露。

图片.png