专栏首页测试开发架构之路C++之类和对象的使用(二)

C++之类和对象的使用(二)

析构函数

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

析构函数是一种特殊的成员函数,它的作用与构造函数相反,它的名字前面加一个“~”符号,在C++中,“~”是取反运算符,这点可以看出析构函数和构造函数的作用是相反的。

当对象的生命结束时,会自动执行构造函数。具体有以下四种情况:

1)如果在一个函数中定义了一个对象(假设是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数

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

3)如果定义了一个全局的对象,则在程序的流程离开其作用域时,调用该全局的对象的析构函数。

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

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

除上述作用之外,它可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。例如输入有关信息。。。

//#inculde<string>  //Dev C++条件下编译
#include<iostream>
using namespace std;
class Student
{
    public:
        Student(int n,string nam, char s)
        {
            num=n;
            name=nam;
            sex=s;
            cout<<"Consrructor called. "<<endl;        
        }
        ~Student()
        {
            cout<<"Destructor called. "<<num<<endl;        
        }
        void display()
        {
            cout<<"num: "<<num<<endl;
            cout<<"name: "<<name<<endl;
            cout<<"sex: "<<sex<<endl;
        }
        private:
            int num;
            string name;
            char sex;        
};
            int main()
            {
                Student stud1(10010,"Wang_li",'f');
                stud1.display();
                Student stud2(10011,"Zhang_dalei",'m');
                stud2.display();
                return 0;
            }  

注意:先执行stud2的析构函数,再执行stud1的析构函数。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++之类和对象的特性

    简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言。 凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象、封装、...

    互联网金融打杂
  • C++之虚函数的作用和使用方法

    在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都...

    互联网金融打杂
  • C语言之函数

      结构化程序设计主张按功能来分析需求,主要原则自顶向下,逐步求精,模块化等。 主张按功能把软件系统逐步细分,每个功能都负责对数据进行一次处理,每个功能接收一些...

    互联网金融打杂
  • 析构函数的用法【简单理论讲解】

    析构函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。析构函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的析构函数是~str...

    Angel_Kitty
  • C++反汇编第二讲,不同作用域下的构造和析构的识别

                   C++反汇编第二讲,不同作用域下的构造和析构的识别 目录大纲:   1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间...

    IBinary
  • 语义分割标注工具Semantic Segmentation Editor 快速安装指南

    Semantic-Segmentation-Editor是由日立汽车工业实验室(Hitachi Automotive And Industry Lab)开源的基...

    AI算法修炼营
  • 唯品会:授权流程说明

    您的应用和唯品会开放平台对接后,需要获取有关用户(包括供应商)受限访问的隐私数据(如:商品、订单等),为保证用户数据的安全性与隐私性,您的应用需要取得用户的授权...

    凯哥Java
  • 2019-6-1-UML时序图

    在面向对象的软件分析及设计中,UML时序图描述了系统中各个组成部分的信息交互关系。

    黄腾霄
  • tcpdump简明教程

    本文将会持续修正和更新,最新内容请参考我的 GITHUB 上的 程序猿成长计划 项目,欢迎 Star,更多精彩内容请 follow me。

    用户2131907
  • 这些面试必备的Java内存管理知识你需要吗?

    Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为 程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区五个区域,但并没有规定这些...

    Wizey

扫码关注云+社区

领取腾讯云代金券