zoukankan      html  css  js  c++  java
  • C++学习之拷贝构造函数篇

    一、拷贝构造函数的声明

    Array(const Array & arr);

    二、拷贝构造函数的实现分为两种,即是深拷贝和浅拷贝。

    1.浅拷贝

    代码例如以下:

    class Array

    {

    public:

    Array()

    {

    m_iCount = 5; 

      m_pArr = new int[m_iCount];

     }

    Array(const Array& arr)

    {

    m_iCount = arr. m_iCount;

    m_pArr = arr.m_pArr;

    }

    private:

    int m_iCount;

    int * m_pArr;

    }

    int main(void)

    {

    Array arr1;

    Array arr2 = arr1;

    return 0;

    }

    这样的简单的浅拷贝将会使arr1和arr2里面的m_pArr成员的值是一样的。即指向的内存地址是一样的。例如以下图所看到的。此时。假设先给arr1的m_pArr赋了一些值,也就是在内存地址0x00FF00这段内存中写了一些值。然后再给arr2的m_pArr再赋值的时候。那么同一段内存将会被重写,而覆盖掉之前arr1的m_pArr所赋进去的值。更严重的是当我们销毁arr1这个对象的时候,我们为了避免内存泄露。肯定会释放m_pArr所指向的这段内存。假设我们已经释放掉了这段内存。再去销毁arr2对象的时候。肯定也会以相同的方式再释放掉arr2里面的m_pArr所指向的这段内存,这样同一段内存将被释放两次,计算机会以崩溃的方式抗议,与语法错误的提示信息是不一样的,难以查找出错根源。


    2.深拷贝

    因此,我们希望拷贝构造函数所完毕的工作是这种。例如以下图所看到的。两个对象的指针所指向的应该是不同的内存,拷贝的时候不应该是将指针的地址简单地拷贝过来。而是将指针所指向的地址中存储的每个元素依次地拷贝过来。这个才是我们真正想要的效果,这个过程就是深拷贝。

    代码例如以下:

    class Array

    {

    public:

    Array()

    {

    m_iCount = 5; 

      m_pArr = new int[m_iCount];

     }

    Array(const Array& arr)

    {

    m_iCount = arr. m_iCount;

    m_pArr = new int[m_iCount];

    for(int i=0;i<m_iCount;i++)

    {

    m_pArr[i] = arr.m_pArr[i];

    }



    //m_pArr = arr.m_pArr;

    }

    private:

    int m_iCount;

    int * m_pArr;

    }

    int main(void)

    {

    Array arr1;

    Array arr2 = arr1;

    return 0;

    }



    3.总结:

    当进行对象拷贝时,不是简单地进行值得拷贝。而是将堆中内存的数据也进行拷贝。这样的拷贝方式就叫做深拷贝,仅仅进行值得拷贝的方式叫做浅拷贝。深浅拷贝具有下面特点:

    (1)当数据成员中含有指针时。浅拷贝会使两个对象的成员指针指向同样的地址,这个时候会导致地址反复删除或被又一次赋值。

    (2)不是全部的对象都须要深拷贝,应该依据情况合理使用。

    (3)深拷贝不是简单的值拷贝。而是又一次分配相同大小的内存地址。将指针成员指向的内存数据进行拷贝。

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7279228.html
Copyright © 2011-2022 走看看