C++中的析构函数

1,对象的销毁:

    1,生活中的对象都是被初始化后才上市的;

       1,为了引入生活中初始化的过程,我们引入了构造函数的概念;

    2,生活中的对象被销毁前会做一些清理工作;

       1,生活中手机在回收机构被拆卸,之后将能复用的材料运回工厂再加工利用;

    3,C++ 中如何清理需要销毁的对象?

   

2,一般而言,需要销毁的对象都应该做清理,解决方案:

    1,为每一个类都提供一个 public 的 free 函数;

    2,对象不再需要时立即调用 free 函数进行清理;

 3,代码示例:

1 class Test
2 {
3     Int* p;
4 public:
5     Test() { p = new int; }
6     void free() { delete p; 
7 };

   

3,IntArray 使用分析实例分析:

    1,见“C++学习笔记”系列博客中“C++中的深拷贝和浅拷贝构造函数”第9条目中的内容;

    2,未有定义析构函数,只是一个 free() 函数,会造成本文中的问题;

   

4,存在的问题:

    1,free 只是一个普通的函数,必须显示的调用;

    2,对象销毁前没有做清理,很可能造成资源泄漏;

       1,很可能会造成软件长时间运行的不稳定;

    3,C++ 编译器是否能够自动调用某个特殊的函数进行对象的清理?

   

5,析构函数:

    1,C++ 的类中可以定义一个特殊的清理函数;

       1,这个特殊的清理函数叫做析构函数;

       2,析构函数的功能与构造函数相反;

    2,定义:~ClassName()(这个特殊的符号是取反的意思)

       1,析构函数没有参数也没有返回值类型声明;

           1,析构函数是不能重载的,因为重载需要参数列表不同;

           2,只剩下函数体可以利用;

       2,析构函数在对象销毁时自动被调用;

      

6,析构函数使用初探编程实验:

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5     int mi;
 6 public:
 7     Test(int i)
 8     {
 9         mi = i;
10         printf("Test(): %d\n", mi);
11     }
12     
13     ~Test()
14     {
15         printf("~Test(): %d\n", mi);
16     }
17 };
18 
19 int main()
20 {
21     Test t(1);  // 这里被创建,促进构造函数语句的打印,到 return 之前时,局部变量就会被销毁,此时析构函数被自动调用;
22     
23     Test* pt = new Test(2);  // 堆空间上定义对象,调用构造函数;
24     
25     delete pt;  // 删除指针的同时销毁堆空间对象,此时会调用析构函数;
26     
27     return 0;  // 在此语句之前,调用 t 对象析构函数;
28 }

   

7,IntArray 类的进化编程实验:

    1,将 free() 函数换为析构函数来实现;

    2,析构函数只是自动调用并做一些简单的析构,对于系统资源的析构,还是要手动进行;

   

8,析构函数的定义准则:

    1,当类中自定义了构造函数,并且构造函数中使用了系统资源(如:内存申请,文件打开等),则需要自定义析构函数;

       1,自定义了构造函数,多半要自定义析构函数,因为自定义构造函数多半会申请系统资源;

       2,析构函数完成的工作有:

           1,归还内存;

           2,关闭文件等;

   

9,小结:

    1,析构函数是对象销毁时进行清理的特殊函数;

    2,析构函数在对象销毁时自动被调用;

    3,析构函数是对象释放系统资源的保障;

       1,使编写的软件更加稳定;

转载于:https://www.cnblogs.com/dishengAndziyu/p/10906406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值