析构函数

2.1 析构函数定义和使用

析构函数(destructor)是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。在C++中“~”是位“取反”运算符,从这一点可以想到:析构函数是与构造函数作用相反的函数。例如:

class student{

public:

student()//构造函数

{

}

~student() //析构函数

{   }

void print(){}

};

可以看到,定义了一个student类。然后,定义student类的构造函数和析构函数。其中,析构函数的定义如下:

~student(){ }

那么,函数名是类名前面添加取反符号“~”,而且,函数没有参数。

当对象的生命周期结束的时候,就会自动执行析构函数。如果出现以下几种情况,程序就会执行析构函数:

(1) 如果在一个函数中定义了一个对象,那么,该对象就是局部对象,当这个函数被调用结束时,对象的生命周期结束。此时,对象应该释放(销毁),在对象释放(销毁)前自动执行析构函数。

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

因为static局部对象的生命周期是整个程序运行过程,所以,只有程序结束运行的时候,static局部对象的生命周期才结束,才执行类的析构函数。

(3) 如果定义了一个全局对象,全局对象的生命周期是整个程序运行过程,所以,当程序结束运行的时候,全局对象才销毁,此时,调用该全局对象的析构函数。

(4) 如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。

析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前,完成一些清理工作。使这部分内存可以被程序分配给新对象使用。程序设计者要设计好析构函数,以完成所需的功能,只要对象的生命周期结束,程序就会自动执行析构函数来完成这些工作。

析构函数不返回任何数值,也没有函数类型 和 函数参数。由于没有函数参数,因此,它不能被重载。一个类可以有多个构造函数,但是,只能有一个析构函数。

一般情况下,类的设计者应当在声明类的同时定义析构函数,以指定如何完成“清理”的工作。如果用户没有定义析构函数,C++编译系统会自动生成一个 默认析构函数,但是,它只是有析构函数的名称和形式,实际上什么操作都不进行。想让析构函数完成任何工作,都必须在定义的析构函数中执行。

如下是一个程序测试例子,讲解构造函数和析构函数的使用。

程序运行结果如下:

在main()函数中,定义一个if(1){}代码块,在代码块中定义stud局部变量。当退出代

码块的时候,销毁stud局部变量,看到析构函数的调用。

所以,我们看到对象销毁的时候,自动调用析构函数。析构函数是不可以手动调用的。是对象销毁的时候,由系统自动调用。

所以,对象销毁的时候,我们想释放一些资源,就可以放在析构函数中操作。例如,student类中的name, addr是动态申请的内存。那么,在析构函数中就释放这些内存。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

C++析构函数定义和使用相关推荐

  1. 父类的析构函数定义为虚函数

  2. 为什么一般要定义析构函数为虚析构函数

    没有使用虚析构函数可能会出现的问题: #include <iostream> #include <string> using namespace std;class A { p ...

  3. C++ 析构函数(函数前面有波浪号~)

    什么是析构函数 析构函数定义类型和构造函数的定义类型差不多, 也是名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数.析构函数有助于在跳出程序(比如 ...

  4. unique函数_C++智能指针2:(虚?)析构函数(标准与实现的差异)

    只要是有良心的 C++ 教材,总是会苦心孤诣地告诫初学者,在继承关系中,应该把父类的析构函数定义成虚函数.这已然成为一条铁律,如果违背,不仅有内存泄漏的风险,在多继承情况下甚至会出现未定义行为.因此, ...

  5. C++中的构造函数VS析构函数

    1.构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行.构造函数的名称与类的名称的完全相同的,并且不会返回任何数据类型,也不会返回void.构造函数用于为某些成员变量设置初 ...

  6. C++中构造函数和析构函数

    [注]致力于将知识讲明白!不懂请留言! 构造函数 定义 它是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中. 另外,一个类可以有 ...

  7. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

  8. C++ 虚析构函数

    类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员.如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作. 通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复 ...

  9. 只在堆上或只在栈上定义对象

    转自:http://blog.csdn.net/g5dsk/article/details/4775144 代码: [cpp] view plaincopyprint? class OnlyHeapC ...

  10. (学习c++primer5th的重要)c++ primer5th类指针版本hasptr (网上源代码错误) 定义错误

    首先回顾点知识点(以下是我自己的想法,如有错误,请在评论区多多指正): 1.如果一个内置指针被别的指针接管资源,那么它必须置于安全析构状态(nullptr或者0都可以) 2.如果一个容器被接管资源,那 ...

最新文章

  1. PHP使用APNS的 feedback service
  2. hive的multi-distinct可能带来性能恶化
  3. 基于BCH的SLP代币超过1000种,探秘SLP的内部生态
  4. php js vbs,VBScript版的PHP extract()函数
  5. 这么多连麦方案,到底哪种适合你?
  6. Android开发之git提交代码到GitHub仓库教程
  7. Together与Visual.Studio.NET的结合使用(三)
  8. notion函数_Notion使用指南 | Database篇
  9. 苹果iPhone发布13周年:累计销量近20亿部
  10. echarts grid的样式位置_CSS Grid 系列(下)-使用Grid布局构建网站首页
  11. python能做什么工作-学Python能找到什么工作?这4种工作最热门!
  12. velocity 将数字转为以万为单位,保留2位小数
  13. nginx学习笔记01
  14. 用AI「驯服」人类幼崽,手头有娃的可以试试
  15. 附件文件超过了服务器的大小,Exchange 2010设置附件大小
  16. RapidMiner 数据转换
  17. python生成树状图_用 python 将思维导图转换成树形列表
  18. 宽带服务器维护查询,网络连接状态查询方法
  19. 安卓模拟器,需要的自取
  20. epub文件是什么文件?如何在windows系统上打开?

热门文章

  1. 【洛谷P4568】飞行路线【分层图最短路】
  2. python房屋租赁系统的设计与实现_毕业设计---在线房屋租赁系统的设计与实现.doc...
  3. 爬虫基础 || 2.1 request介绍(功能比urllib丰富,附上简单的知乎爬虫)
  4. ffmpeg转换进度计算公式
  5. php array_change_key_case()
  6. 线性代数笔记2:基本子空间的正交性及性质
  7. Spyder无法启动
  8. php ucfirst();函数
  9. PS笔刷素材套装:81种自定义树叶水彩/水粉画
  10. 超级右键-Mac右键扩展工具