深拷贝和浅拷贝的区别详解

article/2025/9/17 2:36:21

深拷贝和浅拷贝的作用是复制对象数据,这两者都用于构造拷贝构造函数中,那么这俩之间到底有什么区别呢?
先上答案

- 浅拷贝:简单的赋值拷贝操作
- 深拷贝:在堆区重新申请内存空间,进行拷贝操作

下面举一个例子,让大家看看深拷贝和浅拷贝的不同之处

Class Student
{
public:int age;Student(int i_age){age=i_age;cout<<"执行构造函数"<<endl;}~Student(){cout<<"执行析构函数"<<endl;}
}
int main()
{Student a(18);Student b(a);cout<<"a的年龄为"<<a.age<<endl;cout<<"b的年龄为"<<b.age<<endl;return 0;
}

代码很简单,这里建立Student类型,创建Student类对象a,和b。其中a是使用一般构造函数创建,b是使用C++默认的拷贝构造函数创建。这里的拷贝构造函数执行的就是浅拷贝的操作。现在b的age也等于18。

在默认情况下,C++编译器会默认给一个类添加3个函数
1.默认构造函数
2.默认析构函数
3.拷贝构造函数(对对象的属性值进行浅拷贝)

这其中,若用户定义了构造函数,C++就不会再给用户提供这个默认构造函数,但是还是会提供拷贝构造函数
若用户定义了拷贝构造函数,那么C++就不会提供任何默认构造函数了

在原来的代码的基础上,若我们添加一个指针变量,情况就大不一样了:

Class Student
{
public:int age;int* height;Student(int i_age,int i_height){age=i_age;height=new int(i_height);//在堆上申请内存空间cout<<"执行构造函数"<<endl;}~Student(){delete height;//释放开辟的内存空间height=nullptr;cout<<"执行析构函数"<<endl;}
}
int main()
{Student a(18,170);Student b(a);cout<<"a的年龄为"<<a.age<<endl;cout<<"b的年龄为"<<b.age<<endl;return 0;
}

此时如果仍然使用C++提供的浅拷贝构造函数进行拷贝赋值操作,程序运行时就会出错。如图:请添加图片描述
可以看出,使用默认的拷贝构造函数执行浅拷贝时,学生a的height指针的内容直接被粗暴地复制进了b的height指针中,这么一来其实两个对象a,b指向的是堆区的同一块空间。
此时,当上述main函数执行完毕进行空间释放的时候,b的析构函数会将堆区的那块数据释放掉,然而轮到a的时候重复释放了那个空间,就会造成错误。

但如果我们写了拷贝构造函数对其进行深拷贝,就不会出错了。

Class Student
{
public:int age;int* height;Student(int i_age,int i_height){age=i_age;height=new int(i_height);//在堆上申请内存空间cout<<"执行构造函数"<<endl;}~Student(){delete height;//释放开辟的内存空间height=nullptr;cout<<"执行析构函数"<<endl;}Student(Const Student &i_student){age=i_student.age;height=new int(*i_student.height);}
}
int main()
{Student a(18,170);Student b(a);cout<<"a的年龄为"<<a.age<<endl;cout<<"b的年龄为"<<b.age<<endl;return 0;
}

此时的拷贝构造函数就是在进行深拷贝。其在拷贝复制的时候使用a中height的数据,在堆区重新创建了一块内存空间。此时对象a和对象b的指针所指向的值虽然相同,但是指向的空间互不干扰,因此运行就不会发生错误。
请添加图片描述再回到开头:

- 浅拷贝:简单的赋值拷贝操作
- 深拷贝:在堆区重新申请内存空间,进行拷贝操作

这便是深拷贝和浅拷贝的区别

参考链接:
http://c.biancheng.net/view/2336.html

https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=15061708222472536109&spm_id_from=333.337.0.0


http://chatgpt.dhexx.cn/article/KsPRkR2A.shtml

相关文章

Python深拷贝与浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝&#xff0c;都会生成一个看起来相同的对象&#xff0c;他们本质的区别是拷贝出来的对象的地址是否和原对象一样&#xff0c;也就是地址的复制还是值的复制的区别。 什么是可变对象&#xff0c;什么是不可变对象&#xff1a; 可变对象是指&am…

详解JS深拷贝与浅拷贝

深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型&#xff0c;浅拷贝会对对象逐个成员依次拷贝&#xff0c;但只复制内存地址&#xff0c;而不复制对象本身&#xff0c;新旧对象成员还是共享同一内存&#xff1b;深拷贝会另外创建一个一模一样的对象&#xff0c;新对象跟原对…

c++深拷贝与浅拷贝

浅拷贝&#xff1a;简单的赋值拷贝操作&#xff08;这个是系统默认提供的&#xff09; 深拷贝&#xff1a;在堆区重新释放空间&#xff0c;进行拷贝操作&#xff08;要自己写的&#xff09; 简单来说&#xff0c;只要类属性里有指针等就必须利用深拷贝操作 为便于深刻理解&a…

实现深拷贝与浅拷贝的方法

深拷贝与浅拷贝概念&#xff1a; 深浅拷贝出现的前提&#xff1a; 应用类型的数据&#xff08;对象和数组&#xff09; 深拷贝就是把目标对象里面的数据一个一个都复制下来&#xff0c;创建出一个一模一样的&#xff0c;存放地址不一样&#xff0c;互不影响。就像真假美猴王。改…

深拷贝和浅拷贝的区别及实现方法

文章目录 一、引言二、浅拷贝1.Object.assign()2.concat()3.扩展运算符 三、深拷贝1. 利用json数据和json字符串之间的转换2.$.extend()3. 递归 查阅多篇文章后&#xff0c;自己归纳总结对深拷贝和浅拷贝的理解&#xff0c;不足之处&#xff0c;还望多多指导 一、引言 基本数据…

深拷贝与浅拷贝的区别

深拷贝与浅拷贝是针对对象属性为对象的&#xff0c;因为基本数据类型在进行赋值操作时&#xff08;也就是深拷贝&#xff08;值拷贝&#xff09;&#xff09;&#xff0c;是直接将值赋给了新的变量&#xff0c;也就是该变量是原变量的一个副本&#xff0c;这时&#xff0c;你修…

深拷贝和浅拷贝的区别是什么?

深拷贝和浅拷贝的区别是什么? 1、浅拷贝 (1)、定义 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主"对象进行拷贝&#xff0c;但不会复制主对象里面的对象。"里面的对象”会在…

深拷贝和浅拷贝常见的实现方式

浅拷贝的实现方式 1. Object.assign()方法 assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象&#xff0c;然后返回目标对象。但是他的拷贝方式不是固定的&#xff0c;看下面的代码演示&#xff1a; let obj {username: kobe}; let obj2 Object.assign({},o…

什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?

拷贝浅是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的就是内存地址&#xff0c;所以如果其中一个对象改变了这个地址&#xff0c;就会影响到…

Java的深拷贝与浅拷贝的区别

1.二者的区别 浅拷贝&#xff1a;在拷贝一个对象时&#xff0c;对对象的基本数据类型的成员变量进行拷贝&#xff0c;但对引用类型的成员变量只进行引用的传递&#xff0c;并没有创建一个新的对象&#xff0c;当对引用类型的内容修改会影响被拷贝的对象。 深拷贝&#xff1a;在…

深拷贝和浅拷贝的区别(必须掌握)

前言&#xff1a; 在面试中&#xff0c;你必须要知道的一个知识点&#xff0c;那就是浅拷贝和深拷贝&#xff0c;那么就必须知道基本数据类型和引用类型&#xff0c;其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同。 网片来自网络&#xff08;侵删&#xff09; …

C++的浅拷贝与深拷贝

目录 前言 一、区别 二、浅拷贝 1.简单描述 2.代码实例 三.深拷贝 1.简单描述 2.代码实例 四.完整代码 五.运行结果 总结 前言 C中有两种拷贝&#xff1a;深拷贝和浅拷贝 要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别 一、区别 1 在未定义拷贝构造函数…

拷贝构造(深拷贝、浅拷贝)

一、概念介绍 拷贝构造&#xff1a;拷贝构造函数&#xff0c;又称构造函数&#xff0c;是一种特殊的构造函数&#xff0c;它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 其唯一的形参必须是引用&#xff0c;但并不限制为const&#xff0c;一般普遍的会加上c…

C++——深拷贝和浅拷贝

1.浅拷贝与深拷贝的区别 浅拷贝&#xff08;默认拷贝函数&#xff09;&#xff1a;将原对象或原数组的引用直接赋给新对象&#xff0c;新数组&#xff0c;新对象/新数组只是原对象的一个引用。 深拷贝&#xff1a;创建一个新的对象和数组&#xff0c;将原对象的各项属性的“值”…

深拷贝和浅拷贝的区别和与原理

一、基本类型和引用类型 string,number,boolean,null,undefined,symbolFunction,Array,Object 基本类型是按值访问的&#xff0c;引用类型是按引用访问 基本类型和引用类型也有人叫原始类型和对象类型&#xff0c;拥有方法的类型和不能拥有方法的类型&#xff0c;可变类型和不…

浅拷贝、深拷贝

深拷贝和浅拷贝 这两个概念是在项目中比较常见的&#xff0c;在很多时候&#xff0c;都会遇到拷贝的问题&#xff0c;我们总是需要将一个对象赋值到另一个对象上&#xff0c;但可能会在改变新赋值对象的时候&#xff0c;忽略掉我是否之后还需要用到原来的对象&#xff0c;那么就…

深拷贝和浅拷贝(copy和deepcopy)详解

深拷贝和浅拷贝&#xff08;copy和deepcopy&#xff09;详解 详细解释存储方式列表的增删改列表修改已有值列表新增一个值列表整体重新赋值 copy与deepcopy的区别不可变类型可变类型 浅拷贝指的是创建一个新对象&#xff0c;其中包含原始对象的引用&#xff08;指针&#xff09…

浅拷贝和深拷贝的区别?

创建Java对象的方式包括new、反射、反序列化、拷贝&#xff0c;那么什么是拷贝呢&#xff1f;浅拷贝和深拷贝又有什么区别呢&#xff1f; 什么是拷贝 拷贝就是为了复用原对象的部分或全部数据&#xff0c;在原对象的基础上通过复制的方式创建一个新的对象。 Object类中有nati…

深拷贝和浅拷贝的区别

首先&#xff0c;明确一点深拷贝和浅拷贝是针对对象属性为对象的&#xff0c;因为基本数据类型在进行赋值操作时&#xff08;也就是拷贝&#xff09;是直接将值赋给了新的变量&#xff0c;也就是该变量是原变量的一个副本&#xff0c;这个时候你修改两者中的任何一个的值都不会…

浅拷贝与深拷贝的区别

浅拷贝与深拷贝 一、数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol)和对象数据类型。 基本数据类型的特点&#xff1a;直接存储在栈(stack)中的数据 引用数据类型的特点&#xff1a;存储的是该对象在栈中引用&#xff0c;真实的…