目录
如果对你有帮助的话,点个赞吧!
析构函数概念:
析构函数定义:类名前面加上~
注意事项:
关于对象的销毁顺序:
析构函数概念:
在对象销毁的时候会自动调用析构函数,对相关资源进行清理
类似之前C语言中的对malloc进行的free,如果不进行清理就会造成内存泄漏
所以,记住:
构造函数完成的不是创建对象,而是对象的初始化
析构函数完成的不是销毁对象,而是对象的资源清理
析构函数定义:类名前面加上~
~:按位取反符号
1、无参数,为返回类型
2、一个类只能有一个析构函数,如果没有定义,编译器自动生成,同时析构函数不支持重载
3、对象生命周期结束时,编译器系统会自动调用析构函数
注意事项:
既然我们不写,编译器会自动生成析构函数,那么这个自动生成的析构函数调用的时候是不是都会对资源进行清理呢?
也不一定
注意:内置类型不做处理,对自定义类型会调用析构函数
内置类型/基本类型:int/char/double/指针 (语言自己定义的类型)
自定义类型:struct/class(也就是根据我们的需求而自定义的类型)
默认生成的析构函数,对内置类型不做处理,也就是说根本就不会调用
如果是自定义类型,对自定义类型就会去调用类的析构函数
什么意思?
加入一个类内部的成员变量全都是内置类型,那么就不会调用析构函数
如果是类内部有成员变量是我们自定义的内置类型,就会去调用这个自定义变量类它自己的析构函数
举个例子:
我们声明了一个类A
然后,又声明了一个类B
我们在类B的内部定义了一个类A的变量
那么,此时这个类A就是一个自定义类型,因为它不属于任何一个基本数据类型
所以,此时这个自定义类型A就会去调用这个类A本身内部的析构函数
注意,调用析构函数,本质上是一种资源清理,从这个角度理解也许会更加顺畅一点
关于对象的销毁顺序:
局部变量的生命周期随着函数栈帧的结束而结束
同时,函数栈帧遵循先进后出的原则,即所谓压栈
所以,反而后面建立栈帧的函数最先执行结束,最先销毁
也就是说该函数内的类对象最先调用析构函数
如果使用static修饰变量,就是全局变量
全局变量的生命周期和整个代码运行的周期绑在一起
所以,程序运行到最后才会进行处理
总的来说:销毁顺序遵循后定义先销毁(进栈先后的缘故)
局部变量->局部静态->全局静态+全局静态
也就是说,对于全局对象和静态全局对象是一样的处理
如果对你有帮助的话,点个赞吧!