简单实现string类,正确管理资源。
1、首先定义它的成员变量:
private:
char* _data;//定义一个字符指针
String(const char* str="") //如果定义对象时没有传参数,使用缺省构造参数构造出""字符串
:_data(new char[strlen(str)+1]) //+1表示多创建一个空间存'\0'
{
strcpy(_data,str);
}
如果我们在实现拷贝构造时(赋值运算符重载类似),进行简单赋值的浅拷贝
String(const String& s)
: _data(s._data)
{}
当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,析构时delete两次一个内存块,会崩溃。所以必须进行深拷贝
String(const String& s)
:_data(new char[strlen(s)+1])
{
strcpy(_data,s._data);
}
现代写法
//利用构造函数,传入s._data创建对象tmp,然后交换_data,tmp._data。此时_data指向根据构造函数new出来的新数据,即_data指向tmp._data,而tmp._data指向NULL。出了函数作用域后,自动调用tmp的析构。这种写法可以只用在构造和析构里,开辟空间或释放空间。
String(const String& s)
:_data(NULL)
{
String tmp(s._data);
swap(_data,tmp._data);
}
String& operator=(const String& s)
{
if(this!=&s)
{
delete []_data;//如果此时的对象是缺省参数构造的,也会开辟空间存'\0',所以都得delete
_data=new char[strlen(s._data)+1];
strcpy(_data,s._data);
}
return *this;
}
现代写法
//String s此时参数没有传&,实参传进来时,会调用拷贝构造函数 s(实参),swap后_data指向s._data,而s出作用域后被析构
String& operator=(String s)
{
swap(_data,s._data);
return *this;
}
如果此时对象S=S,那么会多开辟一块空间,来保存相同的字符串,这样会浪费空间,改进后的代码:
String& operator=(const String& s)
{
if (this != &s)
{
String tmp(s._data);
swap(tmp._data);
}
return *this;
}
~String()
{
if(_data)
{
delete[] _data;
_data=NULL;
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。