详解常见面试题—深拷贝和浅拷贝(C++)

详解常见面试题—深拷贝和浅拷贝(C++)C 类对象的赋值操作分为深拷贝和浅拷贝两种 我们所说的的浅拷贝就是赋值操作 这种拷贝比较常见 比如 classA public A A public inti A A i 5 A A voidmain Aa1 执行默认构造函数初始化 a1 i 7 Aa2 a1 发生赋值操作此刻 a2 i 5 a2 i 7 只修改 a2 中的成员 对 a1 中的不造成影响 return

大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。最近在更新C/C++方面的知识,感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

C++类对象的赋值操作分为深拷贝和浅拷贝两种,我们所说的的浅拷贝就是赋值操作,这种拷贝比较常见,比如:

class A { 
    public: A(); ~A(); public: int i; }; A::A() { 
    i = 5; } A::~A() { 
    } void main() { 
    A a1;//执行默认构造函数 初始化a1.i = 7 A a2 = a1;//发生赋值操作 此刻a2.i = 5 a2.i = 7;//只修改a2中的成员,对a1中的不造成影响 return; } 
class A { 
    public: A(); ~A(); public: char* ptr1; }; A::A() { 
    ptr1 = new char[5]; memset(ptr1, 'h', 5); } A::~A() { 
    if (ptr1 != nullptr) { 
    delete[]ptr1; ptr1 = nullptr; } } void main() { 
    A a1;//执行默认构造函数 A a2 = a1;//发生赋值操作 return; } 

涉及到动态内存的分配与释放的时侯就比较危险,可能会造成对内存的二次释放,出现内存堆被破坏,导致内存奔溃的情况发生!这是为什么呢?我们上述代码中,对于类对象的赋值是简单的拷贝操作,也就是直接把a1中申请的那块内存的值复制给了a2中的ptr1对象,它相当于做了这样一个操作:

a2.ptr1 = a1.ptr1; 

但是我们可以用深拷贝来解决这个问题!

class A { 
    public: A();//默认构造函数 A(const A& A1);//拷贝构造函数 ~A(); public: char* ptr1; }; A::A() { 
    ptr1 = new char[5]; memset(ptr1, 'h', 5); } A::A(const A &A1) { 
    ptr1 = new char[5]; strcpy(ptr1, A1.ptr1); } A::~A() { 
    if (ptr1 != nullptr) { 
    delete[]ptr1; ptr1 = nullptr; } } void main() { 
    A a1;//执行默认构造函数  A a2 = a1;//发生深拷贝赋值操作,另外开辟了内存空间 A a3(a1);//发生深拷贝赋值操作,另外开辟了内存空间 return; } 

码字不易,如果喜欢,赏个点赞+评论+收藏???,感谢您的支持

惯例今日吟诗好几句:“多情自古伤离别,更那堪,冷落清秋节!今宵酒醒何处?杨柳岸,晓风残月。此去经年,应是良辰好景虚设。便纵有千种风情,更与何人说?”

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220628.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:01
下一篇 2026年3月17日 下午8:01


相关推荐

  • c++ 全排列算法

    c++ 全排列算法1 对于无重复值的情况固定第一个字符 递归取得首位后面的各种字符串组合 再把第一个字符与后面每一个字符交换 并同样递归获得首位后面的字符串组合 递归的出口 就是只剩一个字符的时候 递归的循环过程 就是从每个子串的第二个字符开始依次与第一个字符交换 然后继续处理子串 2 假如有重复值呢 由于全排列就是从第一个数字起 每个数分别与它后面的数字交换 我们先尝试加个这样的判断

    2026年3月17日
    2
  • HA高可用集群(双机热备)

    HA高可用集群(双机热备)

    2021年9月13日
    148
  • idea2022.01.21激活码(注册激活)2022.02.15[通俗易懂]

    (idea2022.01.21激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~9A…

    2022年4月1日
    50
  • IT需求分析_中国it技术牛人

    IT需求分析_中国it技术牛人  刚刚走过了非比寻常的2006,IT业将迎来一个怎样的2007?尤其是从采购角度来看,2007年有哪些特点和趋势?又有哪些因素将左右2007年的市场需求?  预测2007年的IT市场需求和采购趋势,则一定要先看整体的经济增长速度。  来自法国国家统计及经济研究所(INSEE)的预测,2007年上半年,美国经济放缓将连带着世界经济发展速度的回落。据INSEE的统计,2006年,中国工业…

    2022年10月4日
    7
  • Linux Vi 文本编辑器常用命令

    Linux Vi 文本编辑器常用命令*LinuxVi文本编辑器常用命令**引言:在Linux中我们常用的文本编辑器有Vi,Vim(Vi的增强版)。而且vi编辑器不仅仅是适用于Linux,它是所有Unix以及Linux系统下的标准编辑器,几乎适用于Unix、Linux系统的所有版本。vi或vim虽然没有Windows操作系统中的图形界面编辑器那样点鼠标的简单操作,但vi编辑器在系统管理、服务器管理字符界面中,永远不是图形界面的编辑器能比的。它能轻易地创建和修改文本文件,维护Linux系统中的配置文件。其实刚开始的时候我也觉得很不习…

    2022年7月26日
    7
  • banana 贴图改衣服颜色:还原度拉满,小白也能精准改色

    banana 贴图改衣服颜色:还原度拉满,小白也能精准改色

    2026年3月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号