您的位置:首页 > 其它

为string类添加一个赋值运算符函数

2016-05-06 01:24 351 查看
面试中经常会被要求写一个string类,其实通过写string类就可以看出来一个人对C++的掌握能力。其实写string类主要就是看赋值运算符的重载函数的写法。在这里我自己实现了两种。如果大家有更好的办法请给我留言。
#include  <iostream>
#include <string.h>
#include <assert.h>
using namespace std;
class cstring
{
public:
cstring(char* data = "\0")
{
m_data = new char[strlen(data)+1];
strcpy(m_data,data);
}
~cstring()
{
delete []m_data;
}
cstring(const cstring &str)
{
m_data = new char[strlen(str.m_data)+1];
assert(m_data != NULL);
strcpy(m_data,str.m_data);
}
//      cstring& operator=(const cstring &str) //一般方法。
//      {
//          if (this != &str)
//          {
//              delete []m_data;
//              m_data = NULL;
//              this->m_data = new char[strlen(str.m_data)+1];
//              strcpy(this->m_data,str.m_data);
//          }
//          return *this;
//      }

cstring& operator=(const cstring &str)
{
if (this != &str)
{
cstring tmp(str);
char* ptmp = tmp.m_data;
tmp.m_data = m_data;
m_data = ptmp;//交换两个对象的两个值通过析构临时对象的成员变量来析构本身的变量。
}

return *this;

}

void show()
{
cout<<this->m_data<<endl;
}
private:
char* m_data;
};

int main()
{
cstring str("srtff");
cstring fg(str);
cstring df;
df = fg;
str.show();
fg.show();
df.show();
return 0;
}
第一种一般方法主要过程就是,首先释放掉本来的内存空间,然后为被赋值的对象重新开辟一个和赋值的对象同样大小的空间,进而将字符串拷贝进去。但是这种方法有一个缺点就是如果new失败了。而且已经将原本的内容delete掉了,所以程序面对的只能是崩溃,不是一个安全且健壮的程序所能展现的。

第二种方法是先构造了一个临时变量。然后通过临时变量来将值进行交换,且之后出了该作用域,临时变量会被析构了。不需要再为没有new成功却先delete的方面去考虑。这样的做法是即简洁又安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: