前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >拷贝构造函数 浅拷贝与深拷贝

拷贝构造函数 浅拷贝与深拷贝

作者头像
叶茂林
发布于 2023-07-30 01:46:40
发布于 2023-07-30 01:46:40
30200
代码可运行
举报
运行总次数:0
代码可运行

拷贝构造函数

上一期中我们讲述了构造函数的相关内容,谈到构造函数在形式上有几种分类,即带参数的、不带参数的以及参数列表初始化的,还有一种传引用的构造函数,称为拷贝构造函数,顾名思义,就是起到拷贝的功能,通过一个已经存在的类对象的相关数据初始化一个新的类对象。

我们还是用Point这个类作为例子进行讲解,拷贝构造函数就是参数类型为引用类型的构造函数。

代码语言:javascript
代码运行次数:0
运行
复制
class Point
{
	double x,y;
	public:
		Point(Point & point);
};

浅拷贝

所有的类都有自己的拷贝构造函数,如果程序员自己没有写拷贝构造函数,那么系统会默认生成一个缺省的拷贝构造函数,它采取逐位复制的方法进行对象拷贝,又称为浅拷贝。

我们自己写一个Point类的浅拷贝的拷贝构造函数作为例子:

代码语言:javascript
代码运行次数:0
运行
复制
Point::Point(Point & point)
{
	x=point.x;
	y=point.y;
}

这就是浅拷贝,即逐位复制。看样子没什么毛病,为什么说它浅呢?

实际上,如果数据成员都是基本数据类型,浅拷贝是没有什么问题的。

但是,当一个类的数据成员中含有指针的时候,浅拷贝就会出事。

我们把Point类修改一下,增加一个指针指向Point类,为了安全,我们把这个指针初始化为NULL:

代码语言:javascript
代码运行次数:0
运行
复制
class Point
{
	double x,y;
    Point * p=NULL;
	public:
		Point(Point & point);
};

然后我们用浅拷贝:

代码语言:javascript
代码运行次数:0
运行
复制
Point::Point(Point & point)
{
	x=point.x;
	y=point.y;
    p=point.p;
}

首先x和y是没有问题的,指针p的值虽然是相同了,但是我们的目的是想让指针的值相同吗,显然不是,是想让它们指向的内存单元具有相同的值,如果采用这样的浅拷贝,那么这两个指针指向的是同一块内存,有同学可能会说,这好像没有问题啊,这不也成功复制了吗?问题在于一旦我们修改其中一个类对象的p指向的内容,那么另一个类对象的数据也会改变,因为它们指向的是同一块内存。因此,我们在这种情况下需要用深拷贝。

深拷贝

通过上面的分析,我们知道浅拷贝的问题在于,这两个指针指向了同一块内存,所以只要给生成的类对象一块新内存空间就可以解决问题了:

代码语言:javascript
代码运行次数:0
运行
复制
Point::Point(Point & point)
{
	x=point.x;
	y=point.y;
    if(point.p)
    {
		p=new Point;
		p->x=point.p->x;
		p->y=point.p->y;
	}
}

在这里你可以看到,我们是首先判断p是不是空指针,不是空指针我们再复制,这里非常重要,如果没有这个判断,一旦p是空指针,而我们还是继续操作,引发系统不可预知的错误。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
拷贝构造
拷贝构造特殊构造函数类型转换构造拷贝构造类型转换构造和拷贝构造示例关键字 explicit深拷贝和浅拷贝浅拷贝----复制地址深拷贝----复制内存何时需要自定义拷贝构造函数深浅拷贝示例程序
DeROy
2020/05/11
6330
C++:堆与拷贝构造函数及补充this指针
在 C 语言中,我们通过 malloc 或者 calloc 申请的空间即为堆区的空间,使用完成后用 free 归还申请的内存;而在 C++ 中我们用 new 申请堆区内存,delete 释放内存。操作堆内存时,有借有还,分配了堆内存就要记得对其进行回收,当然,这在 C++ 中是一件很麻烦的事情。
字节星球Henry
2021/08/09
8390
拷贝构造函数,深拷贝,浅拷贝
深浅拷贝的区别:     浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。
zhangjiqun
2024/12/16
1160
从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类与空数组
s1mba
2017/12/28
1.6K0
从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类与空数组
【C++修行之道】类和对象(三)拷贝构造函数
四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?
走在努力路上的自己
2024/05/31
1230
【C++修行之道】类和对象(三)拷贝构造函数
《深度解析 C++中的拷贝构造函数:概念、作用与实践》
在 C++的世界里,拷贝构造函数是一个极其重要的概念,它为对象的复制和初始化提供了一种特殊的机制。理解拷贝构造函数对于编写高效、正确的 C++程序至关重要。那么,什么是拷贝构造函数呢?
程序员阿伟
2024/12/09
1720
c++深拷贝和浅拷贝
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
4710
【C++】揭秘类与对象的内在机制(核心卷之深浅拷贝与拷贝构造函数的奥秘)
TANGLONG
2025/01/19
1410
【C++】揭秘类与对象的内在机制(核心卷之深浅拷贝与拷贝构造函数的奥秘)
C++拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:   int a=88;   int b=a;   而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。   #include   using namespace std;   class CExample {   private:   int a;   public:   CExample(int b)   {   a=b;   }   void Show
_gongluck
2018/03/08
1.1K0
【C++】深拷贝和浅拷贝 ② ( 默认拷贝构造函数是浅拷贝 | 代码示例 - 浅拷贝造成的问题 )
如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " , 在函数中对成员变量进行简单的复制操作 ;
韩曙亮
2023/10/15
2540
【C++】深拷贝和浅拷贝 ② ( 默认拷贝构造函数是浅拷贝 | 代码示例 - 浅拷贝造成的问题 )
拷贝构造与深浅拷贝
如果一个构造函数的第一个参数是自身类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
洁洁
2023/10/10
2000
拷贝构造与深浅拷贝
C++面试题之浅拷贝和深拷贝的区别
先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。
全栈程序员站长
2022/11/10
4090
C++面试题之浅拷贝和深拷贝的区别
C++深拷贝和浅拷贝的深入探索
       先简单的说一下什么是深拷贝,什么是浅拷贝,对于浅拷贝来说其实就是按字节拷贝,对于深拷贝来说是先申请一块自己的内存空间,然后将内容拷贝过来。可以看下下面的代码:
Ch_Zaqdt
2020/03/12
3620
深拷贝、浅拷贝的实现
深浅拷贝的区别: 浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。 深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。
江一铭
2022/06/16
8090
深拷贝、浅拷贝的实现
【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读
如图所见拷贝构造函数是我们的六大成员默认函数之一,构造函数的作用是初始化,析构函数是复制清理工作,而我们的构造拷贝函数是用来同类对象进行赋值给另一个对象时的工作:
鸽芷咕
2024/05/26
1040
【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读
深拷贝与浅拷贝
浅拷贝(Shallow Copy)是一种对对象进行复制的方式,它简单地将源对象的所有成员变量的值复制给目标对象。在浅拷贝中,如果对象中存在指针成员变量,那么只会复制指针的值,而不会复制指针所指向的实际数据。
Andromeda
2023/11/22
1700
【c++】类和对象(四)深入了解拷贝构造函数
拷贝构造函数是构造函数的一个重载形式,拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用,这个我们后面进行讲解
用户11029103
2024/04/02
1280
【c++】类和对象(四)深入了解拷贝构造函数
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
Srlua
2024/05/26
5450
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
【C++】拷贝构造函数与赋值的区别
将一个类拷贝到另一个类中,自然是需要对应的参数的,参数就是类,这里可以传递指针,引用更好,只是传值形参的话,会造成无限递归。
啊QQQQQ
2024/11/19
1640
【C++】拷贝构造函数与赋值的区别
c++ 构造函数详解
上述程序崩溃。在使用t1复制t2时,进行的是浅拷贝,只是将成员的值进行赋值。此时,t1.p = t2.p, 即两个指针指向了堆里的同一个空间。这样,析构函数会被调用两次,这就是错误出现的原因。此问题的解决方法是“深拷贝”。
ruochen
2021/05/20
6030
c++ 构造函数详解
推荐阅读
相关推荐
拷贝构造
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档