浅复制:逐行逐字节的复制工作
class MyString
{
public:
MyString():str(nullptr){};
~MyString();
const char* c_str(){return str;};
char* operator=(const char* s)
private:
char* str;
};
char* MyString::operator=(const char* s)
{
if(str)
{
delete[] str;
}
if(s)//s不为空的时候执行拷贝操作
{
str = new char[strlen(s)+1];
strcpy(str,s);
}
else
str = nullptr;
return str;
}
假如,我们自己实现了String类,重载了”=”操作,里边有一个字符指针。刚开始,s1.str指向this,s2.str指向that,当执行s1=s2时,s1与s2的str同时指向that所在的存储区。这样就会造成两个问题:1)没有指针指向this所在的内存空间使得这片内存空间无法被访问从而成为内存垃圾。2)当s1与s2同时消亡时, that所在的内存空间时,由于有两个指针指向该片区域,故这片区域会被释放两次,这也会引发内存问题。
深复制:将对象中指针成员变量指向的内容,复制到另一个对象中指针指针成员指向的地方,具体的过程如下图所示
实现代码如下:
MyString& operator=(const char& s)
{
if(str) delete[] str;
str = new char[strlen(s)+1];
strcpy(str,s);
return *this;
}