适合校招面试的c++实现string类(=,+,>,<<,[])

前言

c++校招中会经常面到的一道题,今天跟随小猿一起愉快的拿下这道送分题。

一、关于string类?

C++中提供了一种新的数据类型——字符串类型(string)。实际上string并不是C++的基本类型,它是在C++标准库中声明的一个字符串类,用这种数据类型可以定义对象,每一个字符串变量都是string类的一个对象。标准库类型string表示可变长的字符序列,使用string类型必须首先包含它的头文件。

#include //注意无.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,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数。

你可能感兴趣的:(c++,c++)