本博文源于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,值为0m_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:" << _carname() << endl;cout << "tom car name:" << _carname() << endl;return 0;}
通过本博文的学习,读者可以轻松收获析构函数的要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。当然还有一个有趣的现象就是先创建的对象,后析构。
本文发布于:2024-01-31 22:05:11,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170670991131674.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |