#浅拷贝和深拷贝和写时拷贝的区别及原理**
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[]