C++学习研究之析构函数

一、析构函数Destructor.

在C++中,‘~‘是位取反运算符,可想析构函数是与构造函数相反的函数。析构函数没有返回值,没有函数类型,没有参数。由于没有函数参数,因此不能被重载,一个类可以有多个构造函数,但只能有一个析构函数。析构函数并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。

当象生命期结束时,会自动执行析构函数:

1> 在一个函数中定义了一个自动局部对象,当函数调用结束时,对象应该释放,在对象释放前自动执行析构函数。

2> static对象在函数调用结束时对象并不释放,因此也就不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。

3> 若定义了一个全局对象,则在程序流程离开其作用域时(main函数结束或调用exit函数时),调用该全局对象的析构函数。

4> 若是用new运算符动态的建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。

二、调用构造函数和析构函数的顺序

一般而言,先构造的后析构。但也有其他情况,因为可能两个对象的存储类别不同,生命周期不同。归纳为:

1> 全局范围定义的对象,它的构造函数在文件中所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,且不同文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此函数终止),就调用析构函数。

2> 若是在函数中定义的自动局部对象,则在建立对象时调用构造函数。在函数调用结束、对象释放时先调用析构函数。——如函数被多次调用,则在每次建立对象时都要调用构造函数。

3> 若在函数中定义的是静态局部对象,则只在程序第一次被调用建立对象时调用一次构造函数,在调用结束时对象不释放,因此也就不调用析构函数,只在main函数或调用exit函数结束程序时,才调用析构函数。

时间: 2024-11-10 20:19:13

C++学习研究之析构函数的相关文章

C++的开源跨平台日志库glog学习研究(二)--宏的使用

上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. 日志输出宏 这里我们以一条最简单的日至输出为例说明: LOG(WARNING) << "This is a warning message"; 这里LOG是一个宏,其定义如下(logging.h line 487): #define LOG(severity) COMPACT

C++的开源跨平台日志库glog学习研究(一)

作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也学习研究了这个glog库,写个总结如下.走过路过的的各位牛人.高手可以忽略这篇文章了. 从code.google.com下载源码(在这里),在Visual Studio 2010中打开工程,如下: 可见只有四个工程,其中libglog和libglog_static分别是Windows下的动态库和静态

C++的开源跨平台日志库glog学习研究(三)--杂项

在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态断言在调试过程中是一个很重要的手段,而且我们使用的也比较多.相应的,静态断言,也即是编译期断言随着模板编程.元编程的发展,也表现出了动态断言所没有的优势:在编译期完成断言检查,而不是等到运行时! 比如在glog的源码中,有如下代码(logging.h line 908): 1 template <b

面向医学图像分析的深度学习研究方案

面向医学图像分析的深度学习研究方案 这是一篇有关"深度学习在医学图像处理方面"的研究报告的第一节,主要包含研究对象,常用方法,深度学习简介,研究现状,研究重点. 在撰写报告时,我找到了两篇 Deep learning for BioInformation / BioMedicine 的综述文章,也一并分享出来: Deep Learning in Bioinformatic Applications of deep learning in biomedicine 1. 研究背景及意义 医

C++学习研究之一— —输入输出

cout 是在标准库中定义的输出流对象,‘<<’是重定向符. endl是叫操纵符,其实是个模板函数,在输出流中写入换行符,并且刷新输出缓存,而'\n'只是往输出流中写入了换行符,没有刷新输出缓存,在输出到屏幕时,没有明显的区别,但是如果写入到文件时,'\n'只是把内容写道了缓存中,并没有写入到磁盘,而endl则把内容写入到了磁盘. 如果两个加引号的字符数组中间没有除空格和注释以外的字符,预处理器会自动把两个字符数组连接起来,并成一个字符数组.因为预处理器会去掉空行.空格.和注释,所以两个字符数

libevent源码学习研究(libevent-0.1)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">想学习研究libevent怎么设计的,学习它的思想,学习它的设计,奈何自己实力不够啊,于是另辟奇径,从最早的版本开始,一个版本一个版本的学习,不信吃不透它.</span> struct event { TAILQ_ENTRY (event) ev_read_next; TAI

了解点OpenAI及深度学习研究前沿

前言 OpenAI是2015年底刚成立的人工智能公司,由Elon Musk领投,号称有10亿美金的投资额,由几位人工智能的顶尖好手组成.这基本上意味着一个新的DeepMind公司诞生,只不过这次OpenAI是一个组织,不属于任何一个公司. 为什么要了解OpenAI? 因为OpenAI的研究内容很大程度上代表着人工智能的研究方向,由于其非盈利性质以及地处加州硅谷这种黄金地段,未来聚集更多顶尖人才的可能性很大,成为一个和DeepMind公司抗衡的可能性非常大.OpenAI的出现将使顶级人工智能的研究

Android瀑布流StaggeredGridView学习研究

关于Android瀑布流控件,已经在江湖上,流传已久,超过两年时间了.网上也有很多相关学习资源,可以拿来研究学习.github上,就有两个资源,可以供学习者膜拜. 1.https://github.com/maurycyw/StaggeredGridView    此链接有图片加载功能,但功能相对简单些. 2.https://github.com/etsy/AndroidStaggeredGrid  提供的瀑布流功能强大,可以自定义瀑布流列数. 本篇博客,就讲解etsy的源码为主了.首先看效果图

关于sencha touch 的JSONP跨域请求的学习研究

此篇文章是对自己在研究学习sencha touch的过程中的点滴记录,主要是JSONP的跨域请求这方面,对于何为是跨域概念还有不熟悉的,可以自己问下度娘. 先上张图: 我要完成的功能就是表格下拉刷新,并发送请求到我自己写的服务程序端,由于服务程序和此SENCHA的程序不再一个域下,总是出现请求出错(提示的大概信息就是跨域的问题).这两天真是被这个问题折磨的很久,由于没接触过sencha touch 的JSONP,开始也是一头雾水,也看了好多的资料.最终理解了SENCHA里的jsonp的请求模式.