您的位置:首页 > 编程语言 > C语言/C++

C++ string类的简单实现(俩种写法)

2018-04-01 18:45 519 查看

首先是传统写法:

(深拷贝)给要拷贝构造的对象重新分配空间。

(浅拷贝)是对对象的简单拷贝,让几个指针都指向同一块地址空间,在释放这段空间的时候会产生“对已释放的空间再次释放”,导致程序中断。

所以String类的实现是用的深拷贝,如果用浅拷贝,当释放空间会把有用的空间释放掉,因为每次函数完成后会调用析构函数。

传统写法:

传统写法用的是strcpy函数需先创建一个空间把需要拷贝的拷贝过去 然后释放

class String
{
public:
String()
:_str(new char[1])
{
_str='\0';
}
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)
{
char *tmp=new char[strlen(s._str)+1];
delete[]_str;
strcpy(tmp,s._str);
_str=tmp;
}
return *this;
}
~String()
{
if (_str!=nullptr)
{
delete[]_str;
}
}
char *c_str()
{
return _str;
}
private:
char *_str;
};


现代写法:

利用的是swap函数交换。

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)
{

String tmp(s);
swap(_str, tmp._str);

return  *this;
}
char *c_str()
{
return _str;
}
~String()
{
if (_str!=NULL)
{
delete[] _str;
}
}
private:
char *_str;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息