• C++析构函数(转)


    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函数被称为析构函数。

    析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要用户调用,而是在销毁对象时自动执行。与构造函数不同的是,析构函数的名字是在类名前面加一个”~“符号。

    注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,那么编译器会自动生成。

    析构函数举例:

     1 #include <iostream>
     2 using namespace std;
     3 classStudent{
     4 private:
     5 char *name;
     6 int age;
     7 float score;
     8 public:
     9 //构造函数
    10 Student(char *, int, float);
    11 //析构函数
    12 ~Student();
    13 //普通成员函数
    14 void say();
    15 };
    16 Student::Student(char *name1, int age1, float score1):name(name1), age(age1), score(score1){}
    17 Student::~Student(){
    18 cout<<name<<"再见"<<endl;
    19 }
    20 void Student::say(){
    21 cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
    22 }
    23 int main(){
    24 Studentstu1("小明", 15, 90.5f);
    25 stu1.say();
    26 Studentstu2("李磊", 16, 95);
    27 stu2.say();
    28 Studentstu3("王爽", 16, 80.5f);
    29 stu3.say();
    30 cout<<"main 函数即将运行结束"<<endl;
    31 return 0;
    32 }

    运行结果:
    小明的年龄是 15,成绩是 90.5
    李磊的年龄是 16,成绩是 95
    王爽的年龄是 16,成绩是 80.5
    main 函数即将运行结束
    王爽再见
    李磊再见
    小明再见

    可以看出,析构函数在 main 函数运行结束前被执行,并且调用顺序和构造函数正好相反,为了方便记忆,我们可以将之理解为一个栈,先入后出。

    析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

    对象可以认为是通过类这种数据类型定义的变量,它的很多特性和普通变量是一样的,例如作用域、生命周期等。由此可以推断,对象这种变量的销毁时机和普通变量是一样的。

    总结起来,有下面几种情况:
    1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

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

    3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。

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

    注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以分配给新对象使用。

  • 相关阅读:
    网络设备snmp配置syslog方法。
    Oracle19c安装手册Windows及mysql-oracle转换
    Oracle11g--hxss安装
    VMWare ESXI 6.5 的部署及简单使用的说明
    windos下redis的启动与安装
    二、fidder 和 python结合进行 get post 请求发送
    一、fidder工具使用
    Python学习二《数据类型介绍》
    Python学习一《基础规范》
    Charles设置为代理服务
  • 原文地址:https://www.cnblogs.com/vijozsoft/p/5099051.html
Copyright © 2020-2023  润新知