本博文源于C++基础,析构函数是在用于创建对象时完成数据成员的初始化,与之对应,对象生命周期结束前应该完成对象资源的清理,这个工作由析构函数完成。比如创建对象时为数据成员开辟空间,会通过析构函数在对象的生命周期结束前进行释放。 定义析构函数应满足以下要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。博文就以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; }
通过本博文的学习,读者可以轻松收获析构函数的要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。当然还有一个有趣的现象就是先创建的对象,后析构。