zoukankan      html  css  js  c++  java
  • C++深拷贝浅拷贝

    深拷贝和浅拷贝的根本区别是变量和指针内存申请方式的不同导致的,如果对一一个变量则不存在深拷贝和浅拷贝的区别,对于一些类中包含指针的需要进行动态分配内存的进行拷贝的时候会有深拷贝和浅拷贝的区别

    事例如下:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 class CE
     6 {
     7      private:
     8          int a;
     9 public:
    10 CE(int b)
    11 {a=b;}     
    12 };
    13 int main()
    14 {
    15  CE A(100)
    16 CE B=A;
    17 return 0;  
    18 }

    在该例子中class CE没有提供复制构造函数,所以编译器会提供默认的复制构造函数,默认的复制构造函数只是对新的对象的a进行赋值,即a=b操作,在此过程中不存在深拷贝和浅拷贝的区别

    例2

    class CE
    {
        private:
      int a;
      char *b;
    public:
    CE(int c,char *d)
    {
      a=c;
      b=d;    
    } 
    CE(const CE& e)
    {
      a=e.a;
      b=e.b;    
    }   //默认构造函数
    
    CE(const CE& e)
    {
      a=e.a;
      b=new char [a];
      if(b!=0)
    strcpy(b,e.b);     
    }   //深拷贝要提供的构造函数
    
    }
    
    int main()
    {
      CE A(10,"hello");
      CE B=A;
    return 0    
    }
    

     在例2中类中包含指针,则如果不提供复制构造函数怎默认构造函数只是对指针的赋值,并没有重新开辟内存空间,和被复制的b指向同一块内存空间,这种就是浅拷贝,但是这种拷贝容易因为一个对象的析构导致共同指向的内存释放,从而另外一个对象的指针就是野指针了,如果按照例子中提供的复制构造函数,则b会从先心脾内存空间,两个对象中的b指向的也不是同一块内存空间,这样举不会出现上面出现的问题。

  • 相关阅读:
    一个长串由一个字串循环构成
    区间边界 张贴海报的可见性
    summary
    分区本质 从磁盘物理层面优化查询 分区操作的锁表
    全局变量在反汇编中是怎么体现的
    MathType怎么打定积分竖线
    定积分换元法洛必达法则求极限
    静态链表的插入和删除
    Git恢复之前版本的两种方法reset、revert
    服务去耦合
  • 原文地址:https://www.cnblogs.com/hana12169/p/3995540.html
Copyright © 2011-2022 走看看