面试中经常会被要求写一个string类,其实通过写string类就可以看出来一个人对C++的掌握能力。其实写string类主要就是看赋值运算符的重载函数的写法。在这里我自己实现了两种。如果大家有更好的办法请给我留言。
#include <iostream>第一种一般方法主要过程就是,首先释放掉本来的内存空间,然后为被赋值的对象重新开辟一个和赋值的对象同样大小的空间,进而将字符串拷贝进去。但是这种方法有一个缺点就是如果new失败了。而且已经将原本的内容delete掉了,所以程序面对的只能是崩溃,不是一个安全且健壮的程序所能展现的。
#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的方面去考虑。这样的做法是即简洁又安全。