為string類添加一個賦值運算符函數


面試中經常會被要求寫一個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的方面去考慮。這樣的做法是即簡潔又安全。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com