C++析构函数学习笔记
2021/11/21 9:10:13
本文主要是介绍C++析构函数学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本博文源于C++基础,析构函数是在用于创建对象时完成数据成员的初始化,与之对应,对象生命周期结束前应该完成对象资源的清理,这个工作由析构函数完成。比如创建对象时为数据成员开辟空间,会通过析构函数在对象的生命周期结束前进行释放。 定义析构函数应满足以下要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。博文就以Car初始化创建内存,在析构函数里进行释放为例子,体验一把析构函数的使用规则。
文章目录
- 1. 构函数常用格式
- 2. 案例:Car析构函数释放对象资源
- 3. 总结&读者收获
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、一个雷中只能有一个析构函数,不可重载。当然还有一个有趣的现象就是先创建的对象,后析构。
这篇关于C++析构函数学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享