C++ 析构函数与变量的生存周期实例详解
C++ 析构函数与变量的生存周期实例详解
这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。
析构函数(destructor)的名字与类名相同,但是前面要加“~”。析构函数没有参数和返回值,当然也就不能被重载。
何时调用析构函数
析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用。
#include<iostream> using namespace std; class CNum { public: int num; ~CNum() { cout << "destructor" << endl; } CNum() { num = 0; cout << "constractor CNum()" << endl; } CNum(CNum & n) { num = n.num; cout << "constractor CNum(CNum & n)" << endl; } }; CNum fun(CNum n) { cout << "fun()start" << endl; n.num = 3; //这里的修改只是对形参的修改,对实参没影响 return n; } int main() { CNum n1; n1 = fun(n1); return 0; }
运行结果:
constractor CNum()
constractor CNum(CNum & n) //构造形参n
fun()
constractor CNum(CNum & n) //构造作为返回值的临时对象
destructor //fun的返回值是一个临时对象,临时对象的生存周期只有一条语句
destructor //离开fun(),形参n消亡
destructor //main结束时局部变量n1消亡
请按任意键继续. . .
调用函数时使用传引用而不是直接传递对象,可以省掉很多次不必要的函数调用,特别是这个函数会被频繁调用的时候。
虚析构函数
析构函数可以是虚函数,但是构造函数不能。(想一想构造函数可以重载,但析构函数不能,这对冤家也算扯平了吧╮(╯▽╰)╭)
一般来说,一个类如果定义了虚函数,则最好将析构函数也定义成虚函数。之所以有这样的建议,因为这里容易出现隐蔽的bug。看一段代码:
class CShape { public: ~CShape() {/*什么也不做*/} }; class CCircle :public CShape { public: CCircle() {/*这里分配了内存*/} ~CCircle() {/*这里释放了内存*/ } }; int main() { CShape * ptrShape = new CCircle(); delete ptrShape; return 0; }
那么, delete ptrShape; 执行时是执行了哪一个析构函数呢?恰恰不是我们希望调用的 ~CCircle(),而是调用了什么都不做的~CShape(),内存泄露了。为了避免发生这种事一般采取的办法就是把析构函数定义成虚函数。也就是 virtual ~CShape(){/*什么都不做*/}; 。只要基类的析构函数是虚函数,那么派生类的析构函数不论是否用“virtule”关键字声明,都会成为虚析构函数。
变量的生存期
1)全部变量的生存周期是从程序开始到最后,而且是先定义的先产生,后消亡。全局变量的构造函数在进入main()之前就已经调用,在推出main()之后才消亡。
2)临时对象的生存周期不会大于语句的执行时间。类型转换语句和返回语句等可能会产生临时变量。
3)局部变量的生存期是从定义开始到最近的“}”结束
4)静态局部变量在第一次执行定义语句时构造产生,在程序的结尾全局变量消亡前消亡。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 本文详细对比了C#中析构函数、Dispose和Close方法的区别,三者都是释放资源,本文介绍了他们各自的使用方法和使用场景,希望对大家有所帮助。...2020-06-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25