千家信息网

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

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍"c++深拷贝与浅拷贝是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"c++深拷贝与浅拷贝是什么"文章能帮助大家解决问题。复制构造函数也叫
千家信息网最后更新 2025年12月02日c++深拷贝与浅拷贝是什么

这篇文章主要介绍"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。
拷贝的两层含义,对应了浅拷贝和深拷贝的概念,做了第一层,就是浅拷贝,做到第二层,就是深拷贝。

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

实例如下:

#include 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:100,hello!!! cout <<"B:"<< B.a << "," < //输出B:100,hello!!!
//修改后,发现A,B都被改变,原因就是浅复制,A,B指针指向同一地方,修改后都改变 B.a = 80; B.str[0] = 'k';
cout <<"A:"<< A.a << "," < //输出A:100,kello!!! cout <<"B:"<< B.a << "," < //输出B:80,kello!!!
return 0;}

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

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

拷贝 对象 指针 函数 指向 属性 成员 就是 输出 c++ 两个 内容 效果 知识 问题 B.a 不同 二层 含义 地址 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何获得天猫的数据库 阿内尔卡数据库 nat dmz服务器 广东揭阳dns服务器云空间 饥荒公共服务器和本地服务器 计算机软件开发合同纠纷案由 云天化信息科技软件开发 服务器board灯是什么意思 信息工程专业从事网络安全 安阳会计财务软件开发 服务器磁盘分盘怎么弄 零基础自学软件开发从何开始 郑州万豪网络技术有限公司游戏 专科毕业计算机网络技术做什么 北京嵌入式软件开发平台 怎样设置网络安全密钥 计算机网络技术单招面试英语 如何用自己电脑做服务器 学校开展网络安全教育简讯 传统软件开发方式 网络安全宣传创意图片 信用卡代还软件开发oem 防范网络安全教案 北京银河网络技术公司 php服务器的桌面管理系统 网络安全工作四字 编程代码如何变成软件开发 党内管理信息系统数据库如何安装 数据库课程设计报告题目 几个网站共享数据库是站群吗
0