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

    对象的销毁:

    前几节的程序中,我们在数组类中自己定义了free函数来释放空间,free函数需要我们手动调用,手动调用就有可能出错或者忘记调用,从而造成内存泄漏。,这次,我们定义了析构函数,由程序自动调用。

    析构函数:

    析构函数没有返回值,没有参数,因此,析构函数是不能重载的。

    析构函数使用初探:

     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
    ", mi);
    11     }
    12     ~Test()
    13     {
    14         printf("~Test(): %d
    ", mi);
    15     }
    16 };
    17 
    18 int main()
    19 {
    20     Test t(1);
    21     
    22     Test* pt = new Test(2);
    23     
    24     delete pt;
    25     
    26     return 0;
    27 }

    运行结果如下;

    数组类进化:

     1 #ifndef _INTARRAY_H_
     2 #define _INTARRAY_H_
     3 
     4 class IntArray
     5 {
     6 private:
     7     int m_length;
     8     int* m_pointer;
     9 public:
    10     IntArray(int len);
    11     IntArray(const IntArray& obj);
    12     int length();
    13     bool get(int index, int& value);
    14     bool set(int index ,int value);
    15     ~IntArray();
    16 };
    17 
    18 #endif
     1 #include "IntArray.h"
     2 
     3 IntArray::IntArray(int len)
     4 {
     5     m_pointer = new int[len];
     6     
     7     for(int i=0; i<len; i++)
     8     {
     9         m_pointer[i] = 0;
    10     }
    11     
    12     m_length = len;
    13 }
    14 
    15 IntArray::IntArray(const IntArray& obj)
    16 {
    17     m_length = obj.m_length;
    18     
    19     m_pointer = new int[obj.m_length];
    20     
    21     for(int i=0; i<obj.m_length; i++)
    22     {
    23         m_pointer[i] = obj.m_pointer[i];
    24     }
    25 }
    26 
    27 int IntArray::length()
    28 {
    29     return m_length;
    30 }
    31 
    32 bool IntArray::get(int index, int& value)
    33 {
    34     bool ret = (0 <= index) && (index < length());
    35     
    36     if( ret )
    37     {
    38         value = m_pointer[index];
    39     }
    40     
    41     return ret;
    42 }
    43 
    44 bool IntArray::set(int index, int value)
    45 {
    46     bool ret = (0 <= index) && (index < length());
    47     
    48     if( ret )
    49     {
    50         m_pointer[index] = value;
    51     }
    52     
    53     return ret;
    54 }
    55 
    56 IntArray::~IntArray()
    57 {
    58     delete[]m_pointer;
    59 }
     1 #include <stdio.h>
     2 #include "IntArray.h"
     3 
     4 int main()
     5 {
     6     IntArray a(5);    
     7     
     8     for(int i=0; i<a.length(); i++)
     9     {
    10         a.set(i, i + 1);
    11     }
    12     
    13     for(int i=0; i<a.length(); i++)
    14     {
    15         int value = 0;
    16         
    17         if( a.get(i, value) )
    18         {
    19             printf("a[%d] = %d
    ", i, value);
    20         }
    21     }
    22     
    23     IntArray b = a;
    24     
    25     for(int i=0; i<b.length(); i++)
    26     {
    27         int value = 0;
    28         
    29         if( b.get(i, value) )
    30         {
    31             printf("b[%d] = %d
    ", i, value);
    32         }
    33     }
    34     
    35     return 0;
    36 }

     我们将free函数改造成了析构函数。

    析构函数的定义准则:

    小结:

  • 相关阅读:
    Linux之uboot分析与移植20160601
    华为C语言编程规范
    中兴软件编程规范C/C++
    枚举esum20160530
    GPS之NMEA协议20160526
    uC/OS-II之系统函数20160526
    UART,USART,SPI,I2C等总线的介绍与区别20160526
    JAVA中使用JSON进行数据传递
    Android:单元测试Junit的配置
    IntentService简介
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9569654.html
Copyright © 2011-2022 走看看