当前位置: 首页 > news >正文

快速弄懂C++中的深拷贝和浅拷贝

浅拷贝

浅拷贝就是单纯拷贝指向该对象的内存,所以在进行多次浅拷贝后只是相当于多了几个指向同一个对象的指针,而深拷贝相当于完全复制了一个对象副本。浅拷贝指的是复制对象的所有成员变量的值,不管这些值是指针、基本数据类型还是其他对象,但当涉及到指针时,浅拷贝只会复制指针的值(即地址),而不是它所指向的数据,这可能会导致多个对象共享相同的数据。这与深拷贝相反,深拷贝会创建原对象指针所指向的数据的一个新副本。

默认的拷贝构造函数和赋值运算符实现的就是浅拷贝。因此,如果你不为类提供自定义的拷贝构造函数和赋值运算符,编译器会为你提供默认的实现,这就是浅拷贝。

以下是一个简单的浅拷贝的例子:

#include <iostream>class ShallowCopy {
public:int* data;ShallowCopy(int d) {data = new int(d);}// 使用编译器生成的默认拷贝构造函数// ShallowCopy(const ShallowCopy& src) = default;// 使用编译器生成的默认赋值运算符// ShallowCopy& operator=(const ShallowCopy& src) = default;~ShallowCopy() {delete data;}
};int main() {ShallowCopy obj1(10);ShallowCopy obj2 = obj1; // 这里进行了浅拷贝std::cout << *obj1.data << " " << *obj2.data << std::endl; // 输出: 10 10*obj1.data = 20;std::cout << *obj1.data << " " << *obj2.data << std::endl; // 输出: 20 20return 0;
}

在上面的例子中,当obj2是通过obj1的拷贝构造函数创建的时,进行的是浅拷贝,所以obj1.dataobj2.data都指向相同的地址。因此,改变其中一个也会影响到另一个。

注意:浅拷贝通常是不安全的,特别是当类中有动态分配的资源时。在上面的例子中,当obj1obj2都析构时,它们都会尝试释放同一块内存,这会导致未定义的行为。为了避免这种情况,你通常需要实现深拷贝或者使用智能指针来管理资源。

深拷贝

在C++中,深拷贝意味着当对象被拷贝时,不仅复制对象的所有成员变量值,而且还复制其指针成员变量所指向的数据。这与浅拷贝相反,浅拷贝只会复制指针的值而不是其所指向的数据,可能导致多个对象共享相同的数据。

为了实现深拷贝,你通常需要为类提供自定义的拷贝构造函数和赋值运算符,并在其中对指针成员进行深拷贝。

下面是一个深拷贝的示例:

#include <iostream>class DeepCopy {
private:int* data;public:DeepCopy(int d) {data = new int(d);}// 自定义拷贝构造函数,实现深拷贝DeepCopy(const DeepCopy& src) {data = new int(*(src.data));}// 自定义赋值运算符,实现深拷贝DeepCopy& operator=(const DeepCopy& src) {if (this == &src) {return *this;  // 处理自赋值的情况}delete data; // 删除当前对象的资源// 为当前对象分配新的资源,并拷贝内容data = new int(*(src.data));return *this;}~DeepCopy() {delete data;}// Getter for demonstration purposesint getData() const {return *data;}
};int main() {DeepCopy obj1(10);DeepCopy obj2 = obj1; // 使用自定义拷贝构造函数,实现深拷贝std::cout << obj1.getData() << " " << obj2.getData() << std::endl; // 输出: 10 10// 修改obj2的内容DeepCopy obj3(30);obj2 = obj3;std::cout << obj1.getData() << " " << obj2.getData() << " " << obj3.getData() << std::endl; // 输出: 10 30 30return 0;
}

在上面的例子中,深拷贝确保了当一个对象被拷贝或分配时,每个对象都有其自己独立的资源副本,这避免了多个对象共享相同的资源。

http://www.lryc.cn/news/232241.html

相关文章:

  • AWD比赛中的一些防护思路技巧
  • 【C++面向对象】14. 命名空间
  • asp.net实验管理系统VS开发sqlserver数据库web结构c#编程web网页设计
  • 基于SSM+Vue的健身房管理系统
  • 《C++避坑神器·二十三》C++异常处理exception
  • 安卓播放解码后的byte字节视频
  • ceph 14.2.10 aarch64 非集群内 客户端 挂载块设备
  • 21、Flink 的table API与DataStream API 集成(2)- 批处理模式和inser-only流处理
  • 051-第三代软件开发-日志容量时间限制
  • 9步打造个人ip
  • 【深度学习】吴恩达课程笔记(四)——优化算法
  • MyBatis-plus 代码生成器配置
  • 框架设计的核心要素
  • LeetCode - 26. 删除有序数组中的重复项 (C语言,快慢指针,配图)
  • C#不安全代码
  • 《C++避坑神器·二十二》VS能正常运行程序,但运行exe程序无响应解决办法
  • lua调用C/C++的函数,十分钟快速掌握
  • 自定义GPT已经出现,并将影响人工智能的一切,做好被挑战的准备了吗?
  • vue中一个页面引入多个相同组件重复请求的问题?
  • Uniapp连接iBeacon设备——实现无线定位与互动体验(实现篇)
  • 【ceph】ceph集群删除pool报错: “EPERM: pool deletion is disabled“
  • 【微信小程序】使用npm包
  • 【开发记录篇】第二篇:SQL创建分区表
  • vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
  • rk3588 usb网络共享连接
  • shell 拒绝恶意连接脚本 centos7.x拒绝恶意连接脚本
  • 【系统架构设计】计算机公共基础知识: 2 计算机系统基础知识
  • 什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?
  • 国内领先的五大API接口供应商
  • 第十九章 Java绘图