C++析构函数详解

首页 >编程笔记 >C++笔记阅读:42,689C++析构函数详解C语言中文网推出辅导班啦,包括「C语言辅导班、C++辅导班、算法/数据结构辅导班」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线,随时响应!析构函数(destructor)是成员函数的一种,它的名字与类名相同,但前面要加~,没有参数和返回值。一个类有且仅有一个析构函数。如果定义类时没写析构函数,则编译器生成默认析构函数。如果定义了析构函数,则编译器不生成默认析构函数。析构函数在对象消亡时即自动被调用。可以定义析构函数在对象消亡前做善后工作。例如,对象如果在生存期间用 new 运算符动态分配了内存,则在各处写 delete 语句以确保程序的每条执行路径都能释放这片内存是比较麻烦的事情。有了析构函数,只要在析构函数中调用 delete 语句,就能确保对象运行中用 new 运算符分配的空间在对象消亡时被释放。例如下面的程序:class String{private:char* p;public:String(int n);~String();};String::~String(){delete[] p;}String::String(int n){p = new char[n];}String 类的成员变量 p 指向动态分配的一片存储空间,用于存放字符串。动态内存分配在构造函数中进行,而空间的释放在析构函数 ~String() 中进行。这样,在其他地方就不用考虑释放空间的事情了。只要对象消亡,就会引发析构函数的调用。下面的程序说明了析构函数起作用的一些情况。#include<iostream>using namespace std;class CDemo {public:~CDemo() { //析构函数cout << "Destructor called"<<endl;}};int main() {CDemo array[2]; //构造函数调用2次CDemo* pTest = new CDemo; //构造函数调用delete pTest; //析构函数调用cout << "-----------------------" << endl;pTest = new CDemo[2]; //构造函数调用2次delete[] pTest; //析构函数调用2次cout << "Main ends." << endl;return 0;}程序的输出结果是:Destructor called-----------------------Destructor calledDestructor calledMain ends.Destructor calledDestructor called第一次析构函数调用发生在第 13 行,delete 语句使得第 12 行动态分配的 CDemo 对象消亡。接下来的两次析构函数调用发生在第 16 行,delete 语句释放了第 15 行动态分配的数组,那个数组中有两个 CDemo 对象消亡。最后两次析构函数调用发生在 main 函数结束时,因第 11 行的局部数组变量 array 中的两个元素消亡而引发。函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用。例如:#include <iostream>using namespace std;class CDemo {public:~CDemo() { cout << "destructor" << endl; }};void Func(CDemo obj) {cout << "func" << endl;}CDemo d1;CDemo Test() {cout << "test" << endl;return d1;}int main() {CDemo d2;Func(d2);Test();cout << "after test" << endl;return 0;}程序的输出结果是:funcdestructortestdestructorafter testdestructordestructor程序共输出 destructor 四次:第一次是由于 Func 函数结束时,参数对象 obj 消亡导致的。第二次是因为:第 20 行调用 Test 函数,Test 函数的返回值是一个临时对象,该临时对象在函数调用所在的语句结束时就消亡了,因此引发析构函数调用。第三次是 main 函数结束时 d2 消亡导致的。第四次是整个程序结束时全局对象 d1 消亡导致的。编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。通俗易懂,深入浅出,一篇文章只讲一个知识点。文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。文章不涉及代码,不烧脑细胞,人人都可以学习。当你决定关注「编程帮」,你已然超越了90%的程序员!

(0)

相关推荐

  • 【C/C 】继承

    概述 继承与派生是同一过程从不同的角度看 保持已有类的特性而构造新类的过程称为继承 在已有类的基础上新增自己的特性而产生新类的过程称为派生 被继承的已有类称为基类(父类) 派生出的新类称为派生类(子类 ...

  • (8条消息) C++ 智能指针 unique

    unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针.unique_ptr对象包装一个原始指针,并负责其生命周期.当该对象被销毁时, ...

  • 他来了,他来了,C 17新特性精华都在这了

    程序喵之前已经介绍过C++11的新特性和C++14的新特性(点击对应文字,直接访问),今天向亲爱的读者们介绍下C++17的新特性,现在基本上各个编译器对C++17都已经提供完备的支持,建议大家编程中尝 ...

  • 胎元命宫详解

    胎元命宫详解 胎元命宫 8.1 胎元 胎, 指人受精怀胎的月份. 其起法是: 人生月后紧接着这个月的天干与生月后第三个月的地支相配, 就为胎元. 如1998年八月生人, 八月为辛酉, 辛后一干是壬, ...

  • 批八字算婚姻详解

    批八字算婚姻详解 很多人喜欢在孩子一出生的时候就给他们算一下八字,因为他们相信孩子的八字和命运是相对注定了的,通过算命之后可以顺利的避免一些可能在生活中遇到的一些问题和坎坷,也可以顺利度过一些&quo ...

  • 电视选购12个重要参数详解,看完你就是专家,附:爆款推荐

    本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:白云上的鱼 创作立场声明:分享电视选购知识,重要参数详解,轻松搞定电视选购. 目前电视的选择太多太多了,品牌百花齐放琳琅满目,各种高科技加成 ...

  • 倪海厦:病是问出来的|问诊十法详解

    倪海厦,美国经方中医,被喻为当代少见的"命.相.卜.山.医"五术兼备之旷世奇人. (倪师)中医的问诊十个法则 我们经方家的问诊非常重要,因此有必要为读者说明一下,如何找经方家看病, ...

  • 为何医生让他把氨氯地平换成缬沙坦?药师详解两类降压药的好与坏

    硝苯地平.氨氯地平.缬沙坦.氯沙坦等等,这些降压药都是高血压患者常用的降压药.从名字中也可以看出这些降压药属于两类不同的降压药,一种是地平类,即为钙离子拮抗剂(CCB),另外一种是沙坦类,即为血管紧张 ...

  • 几何探究类压轴题:精编20例及详解

    成才路上 初中精品学习资料 104篇原创内容 公众号 / END /

  • 高考物理11类重点题型全解析! 附经典例题&详解

    高考理科综合卷中,物理部分选择题有单项和双项选择题两种题型.从最近几年的试题看: 4道单项选择难度低,考查的考点相对稳定且相对单一,涉及的知识点主要有共点力平衡.热力学第一定律.气体状态方程.分子动理 ...

  • 【同步讲练】七年级下册:二元一次方程组七种典型例题详解,一次解决应用问题!

    【同步讲练】七年级下册:二元一次方程组七种典型例题详解,一次解决应用问题!

  • 行书基础笔法详解,以兰亭序为例,建议收藏学习

    学好行书 4篇原创内容 公众号 欢迎您查看行书名帖 在行书的书写中,我们一方面要注意其字形,另一方面更要注意笔画的写法,因为笔画是字的基本构成元素.因此,把握好每个笔画的写法是最为重要的一个学习环节. ...