• 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指向的也不是同一块内存空间,这样举不会出现上面出现的问题。

  • 相关阅读:
    添加远程库
    远程仓库
    删除url中某个参数
    html2canvas.js——HTML转Canvas工具
    vue-cli3与vue-cli2的区别和vue-cli 怎么修改配置
    vue打包后出现一些map文件的解决方法
    微信app右上角自带分享功能
    微信授权获取用户openId的方法和步骤
    支付宝小程序webview里的h5跳转回小程序
    new Date
  • 原文地址:https://www.cnblogs.com/hana12169/p/3995540.html
Copyright © 2020-2023  润新知