c++深拷贝与浅拷贝是什么
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍"c++深拷贝与浅拷贝是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"c++深拷贝与浅拷贝是什么"文章能帮助大家解决问题。复制构造函数也叫
千家信息网最后更新 2025年02月06日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++深拷贝与浅拷贝是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"c++深拷贝与浅拷贝是什么"文章能帮助大家解决问题。
基于以上内容,很容易可以想到,浅拷贝比深拷贝要更快,但是,从拷贝的意义上来看,浅拷贝相较于深拷贝,要欠缺一点。
实例如下:
#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安全错误
数据库的锁怎样保障安全
网络安全等级是多少
交通网络安全手抄报内容
天津 网络安全进课堂
产品数据库管理系统源代码
胜华网络安全专家
河源精益软件开发
软件开发项目 评审意见
淘宝定时抢单软件开发
南宁软件开发公司有哪些
辽宁仓储生鲜配送软件开发
数据库连接池设置
自己搭建的服务器被封怎么办
java连接远程数据库
hcna网络技术资料
移动软件开发实践报告
sqlite数据库拼接
网络安全手抄报简单字少
摩托日记软件开发
数据库自增长id索引
用水粉画2021网络安全手抄报
java软件开发实习目的
嵌入式软件开发人需求
服务器暂不可用夜里出现什么原因
宁波ios软件开发周期
数据库聚簇索引的建立
网络安全教育教案及作业设计
宽城区有名的网络技术质量服务
云音响服务器连接失败怎么解决
服务器功耗低u
网络构建知识模块网络技术框架