1. 程式人生 > 其它 >適合校招面試的c++實現string類(=,+,>,<<,[])

適合校招面試的c++實現string類(=,+,>,<<,[])

技術標籤: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,當類中包括指標類成員變數時,一定要過載其拷貝建構函式、賦值函式和解構函式。