本博文源于C++基础,析构函数是在用于创建对象时完成数据成员的初始化,与之对应,对象生命周期结束前应该完成对象资源的清理,这个工作由析构函数完成。比如创建对象时为数据成员开辟空间,会通过析构函数在对象的生命周期结束前进行释放。 定义析构函数应满足以下要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。博文就以Car初始化创建内存,在析构函数里进行释放为例子,体验一把析构函数的使用规则。
文章目录
1. 构函数常用格式
类名: ~析构函数()
{
函数体
}
2. 案例:Car析构函数释放对象资源
Car内定义了指针数据成员m_pCarName,用来记录存有汽车名称空间的地址,通过构造函数Car(char *con_pcarname,int con_seats)进行初始化,应通过new开辟一段空间存放汽车名称,空间地址记录在m_pCarName中,从运行结果来看,对象生命周期结束时析构函数会被自动调用,完成了资源清理工作。
当然还有一个有趣的现象就是:析构函数的调用顺序和构造函数的调用顺序相反,后创建的对象先析构,先创建的对象后析构。
#include<iostream>
#include<cstring>
using namespace std;
class Car {
public:
Car();//无参构造
Car(char *con_pcarname,int con_seats);//有参构造
~Car();//析构函数声明
char *get_carname();
int get_seats();
private:
char *m_pCarName;
int m_nSeats;
};
Car::Car()//定义无参构造
{
cout << "Car constructor!" << endl;
m_pCarName = nullptr;//初始值为nullptr,值为0
m_nSeats = 4;
}
Car::Car(char *con_pcarname,int con_seats)//定义有参函数
{
int len = strlen(con_pcarname)+ 1;
cout << "Car constructor with param,car name:" << con_pcarname << endl;
m_pCarName = new char[len];//数据成员m_pCarName指向新开辟的空间
strcpy_s(m_pCarName,len,con_pcarname);
m_nSeats = con_seats;
}
Car::~Car() //定义析构函数
{
static int i = 0;
cout << "Car destructor,car name:" << m_pCarName << endl;
if(m_pCarName)//释放m_pCarName指向空间
delete[] m_pCarName;
if(i==1)
system("pause");
i++;
}
char *Car::get_carname() {
return m_pCarName;//获取m_pCarName属性值
}
int Car::get_seats() {
return m_nSeats;//获取m_nSeats属性值
}
int main()
{
Car mynewcar("my car",4);//创建对象
Car tomcar("tom car",7);//创建对象
cout << "my car name:" << mynewcar.get_carname() << endl;
cout << "tom car name:" << tomcar.get_carname() << endl;
return 0;
}
3. 总结&读者收获
通过本博文的学习,读者可以轻松收获析构函数的要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。当然还有一个有趣的现象就是先创建的对象,后析构。