String的深拷贝是一种拷空间拷数据的方法。String的浅拷贝是一种拷数据的方法,只是将指针指向同一块空间,在析构的时候会出错,同一个空间释放多次。深拷贝就是解决浅拷贝的析构问题,但深拷贝会有开辟空间的开销。对此,提出引用计数的浅拷贝,也就是写时拷贝。写时拷贝在下一篇博客中写。
#include<iostream>
using namespace std;
//传统写法:开空间,拷数据
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str,str);
}
String(const String& s)//深拷贝
:_str(new char[strlen(s._str)+1])
{
strcpy(_str, s._str);
}
String& operator=(const String& s)
{
if(this != &s)
{
delete[] _str;
_str = new char[strlen(s._str)+1];
strcpy(_str,s._str);
}
return *this;
}
~String()
{
delete[] _str;
_str = NULL;
}
char* GetStr()
{
return _str;
}
private:
char* _str;
};
//现代写法:别人(tmp)把空间开好,一交换就可以
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
String(const String& s)
:_str(NULL)
{
String tmp(s._str);
swap(_str,tmp._str);
}
String& operator=(const String& s)
{
if(this != &s)
{
String tmp(s._str);
swap(_str, tmp._str);
}
return *this;
}
//String& operator=(String s) //更简单的写法,直接交换
//{
// swap(_str, s._str);
// return *this;
//}
~String()
{
if(_str)
delete[] _str;
}
char* GetStr()
{
return _str;
}
private:
char* _str;
};
测试 用例:
void TestString1()
{
String s1("hello world");
String s2("hello China");
s1 = s2;
cout<<s1.GetStr()<<endl;
cout<<s2.GetStr()<<endl;
String s3(s1);
cout<<s3.GetStr()<<endl;
}
int main()
{
TestString1();
return 0;
}
运行结果:
hello China
hello China
hello China
请按任意键继续…