[经典面试题][百度]c++实现STL中的string类

来源:互联网 发布:在澳洲用淘宝 编辑:程序博客网 时间:2024/05/24 07:22

题目

请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。

代码

/*-------------------------------------*   日期:2015-03-31*   作者:SJF0115*   题目: 实现string类*   来源:百度*   博客:------------------------------------*/#include <iostream>#include <cstring>using namespace std;class String{public:    // 默认构造函数    String(const char* str = NULL);    // 复制构造函数    String(const String &str);    // 析构函数    ~String();    // 字符串连接    String operator+(const String & str);    // 字符串赋值    String & operator=(const String &str);    // 字符串赋值    String & operator=(const char* str);    // 判断是否字符串相等    bool operator==(const String &str);    // 获取字符串长度    int length();    // 求子字符串[start,start+n-1]    String substr(int start, int n);    // 重载输出    friend ostream & operator<<(ostream &o,const String &str);private:    char* data;    int size;};// 构造函数String::String(const char *str){    if(str == NULL){        data = new char[1];        data[0] = '\0';        size = 0;    }//if    else{        size = strlen(str);        data = new char[size+1];        strcpy(data,str);    }//else}// 复制构造函数String::String(const String &str){    size = str.size;    data = new char[size+1];    strcpy(data,str.data);}// 析构函数String::~String(){    delete[] data;}// 字符串连接String String::operator+(const String &str){    String newStr;    //释放原有空间    delete[] newStr.data;    newStr.size = size + str.size;    newStr.data = new char[newStr.size+1];    strcpy(newStr.data,data);    strcpy(newStr.data+size,str.data);    return newStr;}// 字符串赋值String & String::operator=(const String &str){    if(data == str.data){        return *this;    }//if    delete [] data;    size = str.size;    data = new char[size+1];    strcpy(data,str.data);    return *this;}// 字符串赋值String& String::operator=(const char* str){    if(data == str){        return *this;    }//if    delete[] data;    size = strlen(str);    data = new char[size+1];    strcpy(data,str);    return *this;}// 判断是否字符串相等bool String::operator==(const String &str){    return strcmp(data,str.data) == 0;}// 获取字符串长度int String::length(){    return size;}// 求子字符串[start,start+n-1]String String::substr(int start, int n){    String newStr;    // 释放原有内存    delete [] newStr.data;    // 重新申请内存    newStr.data = new char[n+1];    for(int i = 0;i < n;++i){        newStr.data[i] = data[start+i];    }//for    newStr.data[n] = '\0';    newStr.size = n;    return newStr;}// 重载输出ostream & operator<<(ostream &o, const String &str){    o<<str.data;    return o;}int main(){    String str1("hello ");    String str2 = "world";    String str3 = str1 + str2;    cout<<"str1->"<<str1<<" size->"<<str1.length()<<endl;    cout<<"str2->"<<str2<<" size->"<<str2.length()<<endl;    cout<<"str3->"<<str3<<" size->"<<str3.length()<<endl;    String str4("helloworld");    if(str3 == str4){        cout<<str3<<" 和 "<<str4<<" 是一样的"<<endl;    }//if    else{        cout<<str3<<" 和 "<<str4<<" 是不一样的"<<endl;    }    cout<<str3.substr(6,5)<<" size->"<<str3.substr(6,5).length()<<endl;    return 0;}
4 0
原创粉丝点击