扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
简单实现string类,正确管理资源。
成都创新互联公司制作网站网页找三站合一网站制作公司,专注于网页设计,成都网站设计、做网站,网站设计,企业网站搭建,网站开发,建网站业务,680元做网站,已为近1000家服务,成都创新互联公司网站建设将一如既往的为我们的客户提供最优质的网站建设、网络营销推广服务!1、首先定义它的成员变量:
private: char* _data;//定义一个字符指针
2、实现它的构造函数:
String(const char* str="") //如果定义对象时没有传参数,使用缺省构造参数构造出""字符串 :_data(new char[strlen(str)+1]) //+1表示多创建一个空间存'\0' { strcpy(_data,str); }
3、实现拷贝构造
如果我们在实现拷贝构造时(赋值运算符重载类似),进行简单赋值的浅拷贝
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); }
4、实现赋值运算符重载
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; }
5.析构
~String() { if(_data) { delete[] _data; _data=NULL; } }
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流