zoukankan      html  css  js  c++  java
  • 对象的销毁

    • 引入话题:
    1. 生活中的对象都是被初始化后才上市的
    2. 生活中的对象被销毁前会做一些清理工作
    3. 问题:C++中如何清理需要销毁的对象
    4. 一般而言,需要销毁的对象都应该做清理
    • 解决方案:
    1. 为每个类都提供一个public的free函数
    2. 对象不再需要时立即调用free函数进行清理
    1 class Test
    2 {
    3     int*p;
    4 public:
    5     Test() {p = new int;}
    6     void free() {delete p;};
    7 };
    • 存在的问题
    1. free只是一个普通的函数,必须显示调用
    2. 对象销毁前没有做清理,很可能造成资源泄露
    3. C++编译器是否能够自动调用某个特殊的函数进行对象的清理?
    • 析构函数
    1. C++的类中可以定义一个特殊的清理函数
    2. 这个特殊的清理函数叫做析构函数
    3. 析构函数的功能与构造函数相反
    • 定义:~ClassName()
    1. 析构函数没有参数也没有返回值类型声明
    2. 析构函数在对象销毁时自动调用
    3. 析构函数是不能重载的
     1 #include <stdio.h>
     2 class Test
     3 {
     4      int mi;
     5 public:
     6      Test(int i)
     7      {
     8            mi = i;
     9            printf("Test():%d
    ",mi);
    10      }
    11      ~Test()
    12      {
    13            printf("~Test():%d
    ",mi);
    14      }
    15 };
    16 int main()
    17 {
    18      Test t(1);
    19      Test*pt = new Test(2);
    20      delete pt;
    21      return 0;
    22 }
    23 运行结果:
    24 Test():1
    25 Test():2
    26 ~Test():2
    27 ~Test():1
    28 请按任意键继续. . .
    • 析构函数的定义准则
    当类中定义了构造函数,并且构造函数中使用了系统资源(如内存申请,文件打开等),则需要自定义析构函数
    • 小结:
    1. 析构函数是对象销毁时进行清理的特殊函数
    2. 析构函数在对象销毁时自动被调用
    3. 析构函数是对象释放系统资源的保障
     
     
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    【LCA】BZOJ1832 & BZOJ1787(AHOI)-集会
    【线段树+离散化】POJ2528-Mayor's posters
    JavaScript Array 整理
    常见的原生javascript DOM操作
    javascript中执行环境和作用域(js高程)
    javascript作用域链
    javascript执行环境及作用域
    [转]深入javascript——原型链和继承
    [转]深入javascript——构造函数和原型对象
    Java接口中的成员变量为什么必须声明为public static final?
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177263.html
Copyright © 2011-2022 走看看