適合校招面試的c++實現string類(=,+,>,<<,[])
阿新 • • 發佈:2021-01-24
技術標籤:c++
前言
c++校招中會經常面到的一道題,今天跟隨小猿一起愉快的拿下這道送分題。
一、關於string類?
C++中提供了一種新的資料型別——字串型別(string)。實際上string並不是C++的基本型別,它是在C++標準庫中宣告的一個字串類,用這種資料型別可以定義物件,每一個字串變數都是string類的一個物件。標準庫型別string表示可變長的字元序列,使用string型別必須首先包含它的標頭檔案。
#include <string>//注意無.h
using namespace std;
作為標準庫的一部分,string定義在名稱空間std中。
二、模擬實現string類的幾個重要函式
1.類的定義
class MYstring
{
public:
//方法
MYstring();
MYstring(const char*);
~MYstring();
MYstring(const MYstring &);
MYstring& operator = (const MYstring &);
bool operator > (const MYstring &);
MYstring& operator + (const MYstring &);
char operator [] (int);
friend ostream& operator<<(ostream&,const MYstring&);
//屬性
private:
char *data;
int len;
};
2.建構函式與解構函式
//解構函式
MYstring::~MYstring()
{
delete[] data;
}
//預設建構函式
MYstring::MYstring()
{
len = 0;
data = new char('\0');
}
//建構函式
MYstring::MYstring(const char *src)
{
//求src的長度
int srclen = 0;
int i = 0;
while(src[i++])
srclen++;
len = srclen;
//為data分配空間
data = new char[len + 1];
int j = 0;
while(src[j])
{
data[j] = src[j];
j++;
}
cout<<len<<endl;
data[len] = '\0';
}
//拷貝建構函式
MYstring::MYstring(const MYstring &t)
{
len = t.len;
data = new char[len + 1];
int i = 0;
while(t.data[i])
{
data[i] = t.data[i];
i++;
}
data[len] = '\0';
}
3.’='符號的實現
//'='符號的實現
MYstring& MYstring::operator = (const MYstring& t)
{
char *datatem = new char[t.len + 1];
int i = 0;
while(t.data[i])
{
datatem[i] = t.data[i];
i++;
}
datatem[t.len + 1] = '\0';
len = t.len;
delete[] data;
data = datatem;
return *this;
}
4.’+'符號的實現
//'+'號的實現
MYstring& MYstring::operator + (const MYstring& t)
{
MYstring *newt = new MYstring;
delete [] newt->data;
newt->data = new char[len + t.len + 1];
newt->len = len + t.len;
int i = 0;
int j = 0;
while(data[i])
{
newt->data[i] = data[i];
i++;
}
while(t.data[j])
{
newt->data[i] = t.data[j];
j++;
i++;
}
//經常不注意的長度問題
newt->data[newt->len] = '\0';
cout<< newt->len<<endl;
return *newt;
}
5.’>'符號的實現
//'>'符號的實現
bool MYstring::operator > (const MYstring& t)
{
int i = 0;
while(data[i] == '\0' && t.data[i] == '\0')
{
if(data[i] > t.data[i])
return true;
if(data[i] < t.data[i])
return false;
i++;
}
return data[i] > t.data[i] ? true : false;
}
6.’<<'符號的實現
//'<<'符號的實現
ostream& operator << (ostream& os,const MYstring& t)
{
int i = 0;
while(t.data[i])
{
os << t.data[i];
i++;
}
os << endl;
return os;
}
7.’[]'符號的實現
//'[]'符號的實現
char MYstring::operator [] (int index)
{
if(index < 0 ||index > len )
return 'N';
if(index = len)
return '\0';
return data[index];
}
總結
實現string考驗的是c++程式猿的基本功,在這個類中包括了指標類成員變數m_data,當類中包括指標類成員變數時,一定要過載其拷貝建構函式、賦值函式和解構函式。