[C++]深复制与浅复制

news/2024/2/28 14:31:40

深复制与浅复制

C++中,默认的复制构造函数只能实现浅复制。

浅复制指的是在对象复制前,只对对象中的数据成员进行简单的复制

大多数情况下"浅复制"已经能很好的工作了,但是当类的数据成员中有指针类型时,浅复制只会复制指针的值(地址),这样会导致两个成员指针指向同一块内存,从而带来数据安全方面的隐患,如需要分别用delete释放指针所指向的空间时就会出现问题。为了实现正确的复制,此时我们必须编写复制构造函数进行深复制。

深复制指的是当类的成员变量有指针类型时,复制对象时应该为指针变量重新分配一个新的内存空间,使该指针指向这个新的内存空间,避免浅复制中只复制指针的值,使两个指针指向同一块内存。

浅复制和深复制主要的区别就是复制指针时是否创建内存空间 ,如果没有创建内存只复制地址为浅复制,创建新内存并把值全部复制一份就是深复制。采用深复制的情况下,释放内存的时候就不会出现浅复制时重复释放同一内存的错误。
下面是对象采用浅复制的一个案例!

#include <iostream>
#include <string.h>
using namespace std;class Cperson{private:int m_age;char *m_name;public:Cperson(int age,char *name);~Cperson();void Print(void); 
};
Cperson::Cperson(int age,char *name){m_name = new char[strlen(name)+1];if(m_name!=NULL){strcpy(m_name,name);}m_age = age;cout<<m_age<<"的构造函数"<<endl;
}
Cperson::~Cperson(){cout<<"析构姓名:"<<m_name<<endl;if(m_name!=NULL){delete []m_name;	}
}
void Cperson::Print(void){cout<<"My age is "<<m_age<<",My name is "<<m_name<<endl;
}
int main(void)
{Cperson Tom(10,"Tom");Tom.Print();Cperson Jim(Tom);Jim.Print();return 0;
}

运行结果如下:
20230121_1
程序运行的结果出现了错误。这是因为在执行语句

CPerson Tom(10,"TOM");

用动态开辟了一块内存,用来存放"Tom"。而在执行

Cperson Jim(Tom);

时,调用的是默认构造复制函数,实现对应数据的直接复制,即将Tom的成员(Tom.m_age,Tom.m_name)赋值给Jim相应的成员。此时,Tom.m_nameJim.m_name 指向同一块内存,然而系统并没有给 Jim.m_name 开辟相应的内存空间。执行完 Jim.Print()之后,开始执行析构函数,析构函数的执行顺序和对象构造函数的执行顺序相反,所以先执行Jim的析构函数,执行完Jim的析构函数之后,Jim.m_name 所指向的空间已经释放。接着执行Tom的析构函数,此时就会出现问题,即在释放Tom.m_name 所指向的内存空间时会出现问题,因为这段内存空间在Jim的析构函数里已经释放过了。出现这种问题的根本原因在于默认复制构造函数实现的是"浅复制",所以需要定义自己的复制构造函数实现"深复制" ,就可以避免上述问题。下面的代码进行深复制的展示:

/*对象的深复制*/
#include <iostream>
#include <string.h>
using namespace std;class Cperson{private:int m_age;char *m_name;public:Cperson(int age,char *name);Cperson(Cperson &per);~Cperson();void Print(void); 
};
Cperson::Cperson(int age,char *name){m_name = new char[strlen(name)+1];if(m_name!=NULL){strcpy(m_name,name);}m_age = age;cout<<m_name<<"的构造函数"<<endl;
}
Cperson::Cperson(Cperson &per){m_name = new char[strlen(per.m_name)+1];if(m_name != NULL){strcpy(m_name,per.m_name);}m_age = per.m_age;cout<<m_name<<"的拷贝构造函数"<<endl;
}Cperson::~Cperson(){cout<<"析构姓名:"<<m_name<<endl;if(m_name!=NULL){delete []m_name;	}
}
void Cperson::Print(void){cout<<"My age is "<<m_age<<",My name is "<<m_name<<endl;
}
int main(void)
{Cperson Tom(10,"Tom");Tom.Print();Cperson Jim(Tom);Jim.Print();return 0;
}

运行结果如下:
20230121_2

总结:
不知道大家看完之后是否已经理解,其实浅复制与深复制之间的关系除了是否为指针变量开辟新的空间之外,还有一个理解角度就是:浅复制无需手动添加拷贝构造函数,深复制需要手动添加拷贝构造函数。


http://www.ppmy.cn/news/921408.html

相关文章

计算机基础知识文件的复制移动,如何复制文件

如何复制文件 发布时间&#xff1a;2017-04-09 22:23 来源&#xff1a;互联网 当前栏目&#xff1a;电脑基础知识 一. 利用右键菜单复制 这个方法与前面移动文件夹的方法非常相似,只是选择的是右键菜单中的“复制”而不是“剪切”,后面的操作是一样的。复制操作完成后,大家会发…

拷贝的方式

一、深拷贝 拷贝不仅将原对象的各个属性逐个复制出去&#xff0c;而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上。 1.1 JSON.Parse(JSON.stringify) 1.1.1 弊端 如果 obj 的属性有时间对象&#xff0c;则 JSON.stringify 后再 JSON.parse 的结果…

拷贝

拷贝 拷贝是想要干什么的&#xff0c;从名字中就能明白&#xff0c;拷贝想要做的就是复制。   在程序中&#xff0c;对于基本数据变量的复制&#xff0c;可以看到下面的代码直接使用复制语句就完成了基本数据类型的复制过程&#xff0c;改变b变量的值不会影响到a变量的值。 …

如何复制文件?

问&#xff1a; 如何在 Python 中复制文件&#xff1f; 答1: huntsbot.com高效搞钱&#xff0c;一站式跟进超10任务平台外包需求 shutil 有许多方法可供您使用。其中之一是&#xff1a; import shutilshutil.copyfile(src, dst)# 2nd option shutil.copy(src, dst) # dst c…

学会这5个方法,全网任意免费复制,告别付费复制

我们在网上搜索资料的时候&#xff0c;经常需要把有用的内容复制下来。但是&#xff0c;并不是所有的网站内容都可以复制、粘贴&#xff0c;有时候复制内容会弹出开通VIP&#xff0c;立即解锁文本内容。要么就是提示要付费&#xff0c;才能够复制内容。在这种情况下&#xff0c…

特征缩放(归一化处理)

在我们面对多维特征问题的时候&#xff0c;我们要保证这些特征都具有相近的尺度&#xff0c;这将帮助梯度下降算法更快地收敛。 以房价问题为例&#xff0c;假设我们使用两个特征&#xff0c;房屋的尺寸和房间的数量&#xff0c;尺寸的值为 0-2000平方英尺&#xff0c;而房间数…

ceph----应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1.1 服务端操作1.2 客户端操作 二、创建 Ceph 块存储系统 RBD 接口三、OSD 故障模拟与恢复 一、创建 CephFS 文件系统 MDS 接口 1.1 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node0…

什么是对比度、亮度?教你在线调整图片色彩

在对照片进行编辑的时候&#xff0c;肯定会碰到对图片的亮度、清晰度进行调整&#xff0c;相信很多小伙伴根本不清楚什么是图片的对比度亮度&#xff0c;这里首先给大家科普一下&#xff1a;图片的亮度即亮度指照射在景物或图像上光线的明暗程度。图像亮度增加时&#xff0c;就…

如何完成两幅图片差异对比

最近制作一个监控系统。。有一个难题。从摄像头上抓下的两幅图片本身存在少许差别。因此不能直接对图片对比。请教一对比 算法 &#xff0c;最好可以调节差异灵敏度&#xff01; 转成灰度图再求。 nGray0.299*R0.587*G0.114*B 对每个象素用这个公式求灰度&#xff0c;然后对…

详解HDR的三个标准——HLG/HDR10/Dolby Vision

HDR的三大标准&#xff1a;HLG&#xff08;Hybrid Log Gamma&#xff09;&#xff1b;HDR10&#xff1b;Dolby Vision HLG&#xff1a;HLG的全称是Hybrid Log Gamma&#xff0c;它是由英国BBC和日本NHK电视台联合开发的高动态范围HDR的一个标准。HLG不需要元数据&#xff0c;能…

Zookeeper简介及核心概念

一、Zookeeper简介 二、Zookeeper设计目标 三、核心概念 3.1 集群角色 3.2 会话 3.3 数据节点 3.4 节点信息 3.5 Watcher 3.6 ACL 四、ZAB协议 4.1 ZAB协议与数据一致性 4.2 ZAB协议的内容 五、Zookeeper的典型应用场景 5.1数据的发布/订阅 5.2 命名服务 5.3 Master选举 5.4 分…

图像直方图之图像对比度

图像直方图之图像对比度 直方图也可以描述图像对比度的情况。对比度是衡量某一图像某一场景中亮区域和暗区域之间亮度差异的尺度。宽广的直方图可以反映某一图像具有较高对比度&#xff0c;反之&#xff0c;较为窄小的直方图反映了某一图像具有较低对比度。这种对比度的差异可…

如何快速调整图片亮度和对比度?

如何快速调整图片亮度和对比度&#xff1f;有时候图片的亮度和色彩对比度不明显的时候&#xff0c;我们就需要调整图片的亮度和对比度&#xff0c;这样可以让图片呈现出更完美的效果。通过PS软件可以进行调整&#xff0c;但是对于一些不懂ps图片处理技术的小伙伴而言就比较困难…

对比两张图片的相似度

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

电视信号冷知识——电视测试图像

大家应该都有过类似的体验&#xff0c;当我们最喜欢或者常看的电视台停播了之后&#xff0c;我们想要再转到这个台&#xff0c;就会出现一个彩色图案。那么它是什么&#xff1f;为什么会在电视台停播之后出现呢&#xff1f;其实&#xff0c;这个彩色图案的通俗名称为测试图&…

java图片对比度调整

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; java教程全解 java实现图片对比度调整 测试代码 public static void main(String[] args) {//文件与BufferedImage间的转换BufferedImage bifile2img("test.jpg"); //读取图片BufferedImage bii…

批量调整图片亮度和对比度的方法

我曾经在做汽车网站的小编时&#xff0c;每日需要处理多张图片。其中比较大的需求就是批量调整图片亮度和对比度。图片调整完成后&#xff0c;我再上传到网站的各个板块或是形成文章。因为拍摄的图片往往光线不好&#xff0c;而且统一调整后会整体看起来更加协调。以前我处理起…

谈谈人的视觉特性与电视的关系

转自&#xff1a;http://blog.sina.com.cn/s/blog_03e27cc8010183mb.html 2006-11 文/中国电子科技集团公司南京电子工程研究 所 蒋庆全 在人的诸种感觉器官中&#xff0c;视觉在接受外界信息性能上最强。而人的视觉特性与电视早就有了内在的联系。电视画面上所显示的图像和影…

怎么调整图片的对比度?

怎么调整图片的对比度&#xff1f;大家可能还不知道什么是图片的对比度&#xff0c;简单来说对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量&#xff0c;对比度中画面黑与白的比值差异范围越大代表对比越大&#xff0c;差异范围越小代表对比越小。对…

检测低对比度图片教程

检测低对比度图片TOC 连接&#xff1a;检测低对比度图片代码
最新文章