在 C++ 中,拷贝构造函数和赋值运算符可以用来实现对象之间的拷贝操作。当一个类的对象被拷贝时,如果它的成员变量中包含指针类型的成员变量,那么拷贝操作就需要涉及到深拷贝和浅拷贝。

深拷贝(Deep Copy)是指在拷贝对象时,不仅会拷贝对象本身的值,还会为指向的内存动态分配一段新的内存空间,将原对象指向的内存中的数据复制到新的内存中,从而实现独立的复制。这样,在拷贝对象后,如果原对象的指针类型成员变量所指向的内存被修改不会影响到拷贝后的对象。

浅拷贝(Shallow Copy)是指在拷贝对象时,只是简单地复制指针,而不是复制指针指向的内存空间。这样,在拷贝对象后,如果原对象的指针类型成员变量所指向的内存被修改,同样会影响到拷贝后的对象。

#include <iostream>
#include <cstring>class String {
public:// 构造函数String(const char* str = "") {// 分配内存m_data = new char[strlen(str) + 1];// 复制字符串strcpy(m_data, str);}// 拷贝构造函数String(const String& other) {// 分配内存m_data = new char[strlen(other.m_data) + 1];// 复制字符串strcpy(m_data, other.m_data);}// 赋值运算符String& operator=(const String& other) {if (this != &other) {// 释放原内存delete[] m_data;// 分配新内存m_data = new char[strlen(other.m_data) + 1];// 复制字符串strcpy(m_data, other.m_data);}return *this;}// 析构函数~String() {// 释放内存delete[] m_data;}// 输出字符串void print() const {std::cout << m_data << std::endl;}private:char* m_data;
};int main() {String s1("hello"); // 使用构造函数创建 s1String s2 = s1;     // 使用拷贝构造函数创建 s2,进行深拷贝String s3;          // 使用默认构造函数创建 s3s3 = s1;            // 使用赋值运算符,进行深拷贝s1.print();         // 输出 "hello"s2.print();         // 输出 "hello"s3.print();         // 输出 "hello"// 修改原始字符串

什么是深拷贝?什么是浅拷贝?相关推荐

  1. Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  2. 深入理解Python深拷贝(deepcopy)、浅拷贝(copy)、等号拷贝----看了还不懂找我

    编程中难免会遇到copy(浅拷贝)与deepcopy(深拷贝)问题,一不小心就会掉进坑中了,或许很多人只知道有深浅拷贝,但是你又知道copy和"="拷贝有什么区别么?也许很少有人对 ...

  3. Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  4. object.assign()是深拷贝?还是浅拷贝?

    对于Object.assign()而言,如果对象的属性值为简单类型(string,number),通过Object.assign({},srcobj),得到的新对象为深拷贝:如果属性值是对象或其他引用 ...

  5. java什么地方要用深拷贝,关于 Java 浅拷贝、深拷贝,你真的知道了吗?

    这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区.这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助. 在 Java 开发中,对象拷贝或者 ...

  6. 深拷贝(deepcopy)与浅拷贝(copy)的区别

    1.深拷贝与浅拷贝 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):是对于一个对象的顶层拷贝,拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): 是对于一个对象所有层次 ...

  7. python deepcopy_python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: (1) ...

  8. java clone 深拷贝_Java clone() 浅拷贝 深拷贝

    假如说你想复制一个简单变量.很简单: int apples = 5;int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,f ...

  9. python对象复制_Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    源码阅读系列:EventBus title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常 ...

  10. ES6深拷贝与浅拷贝

    小感在前 React学习与开发过程要经历一个相当长的准备阶段,此前看阮一峰老师的文章中,他就特别提到这一点.但是,由于React框架或者说是一种优秀的前端架构实在太诱人,所以,掌握这项技术所涉及的技术 ...

最新文章

  1. 访问修饰符的个人理解-private与protected
  2. 《系统集成项目管理工程师》必背100个知识点-24变更的常见原因
  3. boost::mp11::mp_fold_q相关用法的测试程序
  4. with(nolock)简解
  5. OpenCL 第8课:旋转变换(2)
  6. 什么?你还不知道IDEA Debug界面的按钮都是干啥用的?快进来补补课~
  7. silverlight(二)样式
  8. Mac终端使用技巧 切换到其他路径和目录
  9. 为什么MES系统要定制化?看这三家汽车供应商的苦恼
  10. rman异机恢复数据库
  11. 高数 | 【一元函数积分学】常用积分公式表
  12. Guava Joiner
  13. java根据卡号判断银行卡的基本信息
  14. PayPal的一些注意事项
  15. stm32定时器配置与时间计算公式
  16. 自媒体短视频快速吸引粉丝的诀窍
  17. STM32F103/107 移植Freemodbus RTU
  18. php socket实践
  19. react引入svg图片
  20. 地方性自媒体如何运营?微信公众号可以做地方性自媒体吗?

热门文章

  1. 机器学习入门-西瓜书总结笔记第十一章
  2. 数据禾|2020年全国民用航空机场分布数据
  3. debug笔记—编译报错usr/bin/ld: cannot find -lfl 解决办法;yum 安装软件时,报错:No package XXX available 解决办法
  4. 将本地mysql数据库拷贝到云服务器
  5. leetcode-帕斯卡三角形
  6. 美的集团2023正式批秋招面试凉经
  7. 办公学那个计算机包括哪些专业,计算机有哪些专业 主要学什么
  8. 1024程序员节,发表一个拯救程序员的开箱。
  9. 如何让计算机课变得有趣,10年资深教师走下讲台走到电脑前 让课堂变得更有趣...
  10. JRainbow的简单介绍