c++深拷贝与浅拷贝是什么

发布时间:2022-03-17 13:47:28 作者:iii
来源:亿速云 阅读:107

这篇文章主要介绍“c++深拷贝与浅拷贝是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c++深拷贝与浅拷贝是什么”文章能帮助大家解决问题。

复制构造函数也叫拷贝构造函数;
浅复制也叫浅拷贝或位拷贝;
深复制也叫深拷贝;
浅拷贝和深拷贝
拷贝就是复制,创建副本。假设有对象A,A有属性t1,t2。那么,我通过拷贝A,得到B,B应该也有属性t1,t2,且A、B两个对象的每个属性,都应该是相同的。
对于基本类型的属性t1,拷贝是没有疑义的。简单将值复制一份,就达到了拷贝的效果。而对于引用类型的属性t2来说,拷贝就有了两层含义。
第一层是,我只是将t2引用的地址复制一份给B的t2,确实达到了属性相同的效果,可以理解为实现了拷贝,但是事实上,两个对象中的属性t2对应的是同一个对象。在B对象上对t2所指向的对象进行操作,就会影响到A对象中的t2的值。
第二层是,我将A的t2所指向的对象,假设为o1,完整复制一份,假设为o2,将新的o2的地址给B的t2。也达到了复制的效果,且对B的t2所指向的o2进行操作,不会影响到A的t2所指向的o1。
拷贝的两层含义,对应了浅拷贝和深拷贝的概念,做了第一层,就是浅拷贝,做到第二层,就是深拷贝。

c++深拷贝与浅拷贝是什么

基于以上内容,很容易可以想到,浅拷贝比深拷贝要更快,但是,从拷贝的意义上来看,浅拷贝相较于深拷贝,要欠缺一点。

实例如下:

#include <iostream>using namespace std;//20200430 公众号:C语言与CPP编程
class CopyDemo{public:  CopyDemo(int pa,char *cstr)  //构造函数,两个参数  {     this->a = pa;     this->str = new char[1024]; //指针数组,动态的用new在堆上分配存储空间     strcpy(this->str,cstr);    //拷贝过来  }
//没写,C++会自动帮忙写一个复制构造函数,浅拷贝只复制指针,如下注释部分  //CopyDemo(CopyDemo& obj)    //{  //   this->a = obj.a;  //  this->str = obj.str; //这里是浅复制会出问题,要深复制  //}
 CopyDemo(CopyDemo& obj)  //一般数据成员有指针要自己写复制构造函数,如下  {     this->a = obj.a;    // this->str = obj.str; //这里是浅复制会出问题,要深复制     this->str = new char[1024];//应该这样写     if(str != 0)        strcpy(this->str,obj.str); //如果成功,把内容复制过来  }
 ~CopyDemo()  //析构函数  {     delete str;  }
public:     int a;  //定义一个整型的数据成员     char *str; //字符串指针};
int main(){  CopyDemo A(100,"hello!!!");
 CopyDemo B = A;  //复制构造函数,把A的10和hello!!!复制给B  cout <<"A:"<< A.a << "," <<A.str << endl;  //输出A:100,hello!!!  cout <<"B:"<< B.a << "," <<B.str << endl;  //输出B:100,hello!!!
 //修改后,发现A,B都被改变,原因就是浅复制,A,B指针指向同一地方,修改后都改变  B.a = 80;  B.str[0] = 'k';
 cout <<"A:"<< A.a << "," <<A.str << endl;  //输出A:100,kello!!!  cout <<"B:"<< B.a << "," <<B.str << endl;  //输出B:80,kello!!!
 return 0;}

根据上面实例可以看到,浅复制仅复制对象本身(其中包括是指针的成员),这样不同被复制对象的成员中的对应非空指针会指向同一对象,被成员指针引用的对象成为共享的,无法直接通过指针成员安全地删除(因为若直接删除,另外对象中的指针就会无效,形成所谓的野指针,而访问无效指针是危险的;除非这些指针有引用计数或者其它手段确保被指对象的所有权);而深复制在浅复制的基础上,连同指针指向的对象也一起复制,代价比较高,但是相对容易管理。

关于“c++深拷贝与浅拷贝是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

推荐阅读:
  1. ES6深拷贝与浅拷贝
  2. 深拷贝&浅拷贝

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:c++怎么定义一个只能在堆或栈上生成对象的类

下一篇:JavaScript如何实现数组截断

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》