String类的书写有很多坑,写此博客用来以后复习,
深拷贝处理:拷贝时,给对象开辟同源对象一样大小的空间,避免浅拷贝中因公用一块空间导致的单个空间操作对其他对象的影响,以及在销毁对象资源是一块空间被多次申请释放
#include<iostream>
#include<string.h>
using namespace std;
class String
{
private:
char * _pStr;//用来记录字符串的指针
public:
//构造函数
/*
平常我们可能会这样来用类创建一个对象:
String s1("hello");
String s2("");
string s3(NULL);
故而我们在写构造函数就的有技巧(写成科变参数的形式),当传参是传NULL或""时,我们都统一给开辟一个空间,放“\0”;
*/
String(const char* pStr = NULL)
{
if (pStr == NULL)
{
_pStr = new char[1];
*_pStr = '\0';
}
else
{
_pStr = new char[strlen(pStr) + 1];//strlen函数测出来的长度加1
strcpy(_pStr,pStr);
}
}
//拷贝构造函数:开辟跟源字符串长度一样长的空间给目标对象
String(String& s)
:_pStr(new char[strlen(s._pStr)+1])
{
strcpy(_pStr, s._pStr);
}
//赋值运算符的重载:因为考虑到连续赋值的情况,故返回值设定为右操作数
String& operator=(const String& s)
{
//当发现是自己给自己赋值时,不处理,返回。
if ((*this)._pStr == s._pStr)
return *this;
else if (NULL == this)
{
char *ptemp = new char[strlen(s._pStr) + 1];
// ptemp = s._pStr;
delete _pStr;
_pStr = ptemp;
ptemp = NULL;
}
else
{
strcpy((*this)._pStr,s._pStr);
}
return *this;
}
//析构函数
~String()
{
if (_pStr)
delete[] _pStr;
}
};
int main(void)
{
String s1 = "hello";
String s2(s1);
String s3;
s3=s2;
return 0;
}
结果为: