面试常问啥是深拷贝和浅拷贝,这篇看完你就懂了

学习目标

学习深拷贝和浅拷贝的区别与使用,这非常有必要!
在这里插入图片描述


学习内容

深拷贝和浅拷贝

1、浅拷贝:就是简单赋值的拷贝过去
2、深拷贝:重新在堆里建一个空间,在拷贝过去

上面我们简单的阐述了一下深拷贝和浅拷贝的定义,下面详细解释一下

💖所谓浅拷贝,就是赋值操作,将内容拷贝一份出来,但不被新建一个地址空间,即共享一个空间,如下图:将一个类p1拷贝一份p2,但是其指向的内存地址不变的,也就是说,只是将内容复制出来一份,但不会复制空间
理解:A拷贝出B,A改变,B也改变

浅拷贝图析

💖所谓深拷贝就是将地址在堆区也拷贝出来一份,不再是简单的赋值拷贝,同样的如下图所示,当拷贝完成后,也同样在堆区在建一个地址存放
理解:A拷贝出B,A改变,B不改变

深拷贝图析

💖什么时候要使用深拷贝呢?

一般情况一下都是采用浅拷贝(即类默认的拷贝构造函数)
但当我们的成员有在堆开辟空间(即new)时,这个时候就要采用深拷贝,防止在析构函数时带来重复释放内存的问题

学习代码

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

class Person
{
public:
	char* getchar(){
		return m_Name;
	}
	int getage() {
		return m_Age;
	}
	Person(const char* name, int age) {
		m_Name = new char[strlen(name) + 1];
		strcpy(m_Name, name);
		m_Age = age;
	}
	//深拷贝 若不采用深拷贝,就会有重复释放内存问题,这里深拷贝操作就是new一个堆区内存
	Person(const Person& p) {
		m_Name = new char[strlen(p.m_Name) + 1];
		strcpy(m_Name, p.m_Name);
		m_Age = p.m_Age;
	}
	~Person() {
		cout << "析构函数被调用了..." << endl;
		delete[]m_Name;
		m_Name = nullptr;
	}


private:
	char* m_Name;
	int m_Age;
};


int main() {
	Person p1("nihao", 21);
	cout << "名字是:" << p1.getchar() << "年龄是:" << p1.getage() << endl;
    //浅拷贝方式 析构函数释放出现错误,重复释放同一个内存

	Person p2 = p1;//深拷贝
	cout << "名字是:" << p2.getchar() << "年龄是:" << p2.getage() << endl;


	return 0;
}

代码实现

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说二话的自家人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值