深浅拷贝的原理与区别

本文探讨了浅拷贝和深拷贝的概念,指出浅拷贝可能导致的指针悬挂问题,并介绍了深拷贝如何解决这个问题。此外,还提到了写时拷贝作为另一种拷贝策略,用于优化性能。
摘要由CSDN通过智能技术生成

#浅拷贝和深拷贝和写时拷贝的区别及原理**

1、浅拷贝
当出现类的等号赋值时,会调用拷贝函数
这里写图片描述
什么是浅拷贝?

在未定义显示拷贝构造函数时,系统默认调用拷贝构造函数(浅拷贝),够完成成员的复制。当数据成员中没有指针时,浅拷贝是可行的。

如果有指针,浅拷贝(只是拷贝了指针指向的地址),则类中的两个指针会指向同一块空间,当对象快结束时,会调用两次析构函数释放同一块空间,而导致指针悬挂现象。
所有,这时,必须采用深拷贝。

2、深拷贝
这里写图片描述

深拷贝和浅拷贝的区别

深拷贝会在堆内存中另外申请空间来存储数据,从而解决了指针悬挂的问题。

浅拷贝

浅拷贝,是指原对象与拷贝对象公用一份实体,仅仅是对象名字不同而已,其中任何一个对象改变都会导致其他的对象也跟着它变。如下面这段代码:

#include<iostream>
#include<cstring>
using namespace std;

class String
{
public:
	String(const char* pstr = "")
		:_pstr(new char[strlen(pstr)+1])//为字符串开辟空间
	{
		if (0 == *pstr)  //如果字符串为空
		{
			*_pstr = '\0'; 
		}
		else   //字符串不为空
		{
			strcpy(_pstr, pstr);
		}
	}
	//s2(s1)
	String(const String& s) //拷贝构造函数
	{
		_pstr = s._pstr;
	}
	// s3=s1
	String& operator=(String& s)  //运算符重载
	{
		if (_pstr != s._pstr)
		{
			_pstr = s._pstr;
		}
		return *this;
	}
	~String()
	{
		if (NULL == _pstr)
		{
			return;
		}
		else
		{
			delete[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值