【C/C++】深拷贝与浅拷贝

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、浅拷贝
  • 二、深拷贝
  • 总结

一、浅拷贝

浅拷贝是简单的赋值拷贝操作

浅拷贝是指在对象复制过程中,只会简单地复制对象的值,包括指针的地址,而不复制指针所指向的内容

新对象和原对象将共享同一块内存,如果其中一个对象修改了这块内存,那么另一个对象也会受到影响

#include <iostream>
using namespace std;class Person 
{
public:int* data;  Person(int v) {data = new int;*data = v;}// 浅拷贝Person(const Person& other){data = other.data;    // 浅拷贝,只复制指针地址data = new int(*other.data);};  //析构函数~Person() {delete data;}
};int main() 
{Person test1(42);Person test2(test1);// 修改test1中的data*(test1.data) = 10;// 输出test2中的data,会发现也被修改了cout << "对象test2:  " << *(test2.data) << endl;return 0;
}

在这里插入图片描述

由于浅拷贝只复制了指针地址,所以两个对象共享同一块内存,因此修改test1.data导致了test2.data也被修改

在修改一个对象时,另一个对象也受到影响

二、深拷贝

深拷贝是在堆区重新申请空间,进行拷贝操作

深拷贝是指在对象复制过程中,不仅复制对象的值,还复制指针所指向的内容

这意味着新对象将有其独立的内存副本,对其中一个对象进行修改不会影响到另一个对象

拷贝构造函数中通过为m_height分配新存并复制p.m_agep.m_height的值来执行深拷贝:

#include<iostream>
using namespace std;class Person 
{
public:int m_age;int* m_height;//无参(默认)构造函数Person() {cout << "调用无参构造函数Person()" << endl;}//有参构造函数Person(int age, int height) {cout << "调用有参构造函数Person(int age, int height) " << endl;m_age = age;m_height = new int(height);}//拷贝构造函数  Person(const Person& p) {cout << "调用拷贝构造函数Person(const Person& p)" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;m_height = new int(*p.m_height);}//析构函数~Person() {cout << "调用析构函数" << endl;if (m_height != NULL){delete m_height;}}void test01()
{Person p1(18, 180);Person p2(p1);cout << "p1的年龄: " << p1.m_age << "    身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << "    身高: " << *p2.m_height << endl;
}int main() 
{test01();return 0;
}
};

总结

在C++中,默认的拷贝构造函数和赋值操作符执行的是浅拷贝。当类中包含指针成员时,会出现问题

为了避免浅拷贝带来的问题,可以自定义拷贝构造函数和赋值操作符,以执行深拷贝

深拷贝通过为新对象动态分配内存,并复制指针所指向的内容,从而确保每个对象具有独立的内存块
在修改一个对象时不会影响其他对象

如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索图像处理的利器——OpenCV

目录 引言&#xff1a; 一、OpenCV简介&#xff1a; 二、OpenCV的特点&#xff1a; 三、OpenCV的应用领域&#xff1a; 四、实际案例&#xff1a; 结论&#xff1a; 引言&#xff1a; 在当今信息化的时代&#xff0c;图像处理已经成为了日常生活中不可或缺的一部分。从社…

sql读取数据直接存成pandas

导包 import pymysql import pandas as pd获取mysql链接 def get_db():#打开数据库连接db pymysql.connect(host*.*.*.*,port3306,user "wws",passwd "yourpasswd",db "youdb")return db db get_db()写sql 读数据保存 sql "select…

2.3、Bean的管理

一、Bean的装配&#xff08;IOC应用实现&#xff09; 创建应用组件之间的协作的行为通常称为装配&#xff08;wiring&#xff09;。Spring IOC通过应用上下文&#xff08;ApplicationContext&#xff09;装载Bean的定义并把他们组装起来。 Spring应用上下文&#xff08;Applica…

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网…

面试常问 什么是回表?为什么需要回表?

小伙伴们在面试的时候&#xff0c;有一个特别常见的问题&#xff0c;那就是数据库的回表。什么是回表&#xff1f;为什么需要回表&#xff1f; 索引结构 要搞明白这个问题&#xff0c;需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过&#xf…

iOS多语言解决方案全面指南

本文以及相关工具和代码旨在为已上线的iOS项目提供一种快速支持多语言的解决方案。由于文案显示是通过hook实现的&#xff0c;因此对App的性能有一定影响&#xff1b;除了特殊场景的文案显示需要手动支持外&#xff0c;其他任务均已实现自动化。 本文中的部分脚本代码基于 Chat…

第三方医药数据供应商有哪些?--数据业务介绍

第三方医药数据供应商主要是为医药企业、健康机构、学术研究、药物研发等提供医药相关数据的收集、整理、分析和应用服务。随着医药市场的需求衍生了许多各高垂直领域的医药数据供应商&#xff0c;这也导致了大家对医药数据供应商涉及领域认识的片面性。 故本文重点介绍各医药…

用API Key保护Spring Boot 接口的安全

1、概述 安全性在REST API开发中扮演着重要的角色。一个不安全的REST API可以直接访问到后台系统中的敏感数据。因此&#xff0c;企业组织需要关注API安全性。 Spring Security 提供了各种机制来保护我们的 REST API。其中之一是 API 密钥。API 密钥是客户端在调用 API 调用时提…

HDFS之Java客户端操作

HDFS之Java客户端操作 文章目录 HDFS之Java客户端操作写在前面准备Windows关于Hadoop的开发环境下载依赖配置HADOOP_HOME环境变量配置Path环境变量 创建Maven工程XML文件创建新的Package创建HdfsClient类执行程序 HDFS的API操作 写在前面 Hadoop版本&#xff1a;Hadoop-3.1.3L…

Redis实战——短信登录(二)

Redis代替session redis中设计key 在使用session时&#xff0c;每个用户都会有自己的session&#xff0c;这样虽然验证码的键都是“code”&#xff0c;但是相互不影响&#xff0c;从而确保每个用户获取到的验证码只能够自己使用&#xff0c;当使用redis时&#xff0c;redis的ke…

【永久服务器】EUserv

1. 请先自行准备网络&#xff08;我用的伦敦还可以&#xff09;、以及visa卡&#xff0c;淘宝可以代付&#xff0c;我总共花了97人民币&#xff08;10.94欧代付费&#xff09; 现在只能申请一台&#xff0c;多了会被删除&#xff0c;也就是两欧元&#xff0c;然后选择visa卡 选…

Appium之xpath定位详解

目录 一、基础定位 二、contains模糊定位 三、组合定位 四、层级定位 前面也说过appium也是以webdriver为基的&#xff0c;对于元素的定位也基本一致&#xff0c;只是增加一些更适合移动平台的独特方式&#xff0c;下面将着重介绍xpath方法&#xff0c;这应该是UI层元素定位…