String类的实现

1.常见的面试的时候经常被问到有关string的实现过程,其中包括拷贝构造函数,赋值函数,以及析构函数等,本次如下实现过程加了几个运算符的重载过程。

class String{

    friend ostream& operator<< (ostream&,String&);//重载<<运算符  
    friend istream& operator>> (istream&,String&);//重载>>运算符  

    public:
        String(const char* ptr = NULL); //通配构造函数
        String(const String& str); //拷贝构造函数
        String & operator=(const String & str);//=复制函数
        String & operator+=();//+=元素符重载
        bool operator==();//==运算符重载
        size_t size() const; //获取字符的长度
        const char* c_str();//转化成c字符串
        ~String(); //析构函数
    private:
        char* data;     //实际字符串内容
        size_t length;  //字符串的长度
};

//通用构造函数
String::String(const char* ptr){

    if(!ptr){
        
        data = new char[1];
        *data = '\0';
        length = 0;
    }else{
        length = strlen(ptr);
        data = new char[length + 1];
        strcpy(data,ptr);
    }
    
}


//拷贝构造函数,需要进行深拷贝
//使用方法:String s2(s1); 使用s1来初始化s2,调用该拷贝构造函数进行深拷贝
String::String(const String& str)
{
    if(!str.data){
        data = '\0';
    }else{
        length = strlen(str.data);
        data = new char[length + 1];
        strcpy(data,str.data);
    }
}

//赋值函数
String& String::operator=(const String & str)//赋值构造函数
{
    if(this != &str){
        length = strlen(str.data);
        data = new char[length + 1];
        strcpy(data,str.data);
    }

    return *this;  //自己赋值自身,直接返回该对象即可

}
//累加运算符,需要使用辅助空间来中转存储
String& String::operator+=(const String& str) //+=元素符重载
{
    length += strlen(str.data);
    char* tmp = new char[length + 1];
    strcpy(tmp,data);
    strcat(tmp,str.data);
    delete []data;
    data = NULL;
    data = tmp;

    return *this;
}

//比较函数
bool String::operator==(const String& str)//==运算符重载
{
    if(strlen(str.data) != strlen(data)){
        return false;
    }
    
    return strcmp(str.data,data) == 0? true:false;
    
}

//+操作符,将两个st1+str2生成一个新的string对象
//str3 = str1 + str2;
String& String::operator+(const String& str)
{

    String newstr;
    newstr.length = length + strlen(str.data);
    newstr.data = new char[newstr.length + 1]; //开辟一块新空间
    strcpy(newstr.data,data);
    strcat(newstr.data,str.data);

    return newstr;
    
}

//[]重载运算符
char String::operator[](int n) const
{
    if(n < 0 || n >= length){  //异常处理过程
        return data[0];
    }
    if(data){
        return data[n];
    }
}
size_t String::size() const//获取字符的长度
{
    return length;
}

const char* String::c_str()//转化成c字符串
{
    return data;
}


//重载输出运算符
ostream& String::operator<< (ostream& os,String& str)//重载<<运算符  
{
    os<<str.data;
    return os;
}
//重载输入运算符
istream& String::operator>> (istream& is ,String& str)//重载>>运算符  
{
    该用法是错误的is>>str.data;
    //因为不能确定str.data和输入的字符串的大小
    char tmp[1000] = {0};
    is>>tmp;
    str.length = strlen(tmp);
    str.data = new char[str.length + 1];
    strcpy(str.data,tmp);
    return is;
    
}

String::~String() //析构函数
{
    if(data){
        delete []data;
        data = NULL;
        length = 0;
    }

}

以上为string类的实现过程,

使用实例:

int main(int argc,char** argv){

String s1("ASDFGH"); //调用默认构造函数

cout<<"s1="<<s1.c_str()<<endl;

Striing s2 = s1;  //复制函数

cout<<"s2 = "<<s2.c_str()<<endl;

String s3(s1);//调用拷贝构造函数

cout<<"s3="<<s2.c_str()<<endl;

    return 0;

}

输出结果:

s1=ASDFGH

s2=ASDFGH

s3=ASDFGH

 

#string中的剔除字符串的操作方法

#剔除字符串前后两段的空格

void tirm(std::string & str){

       if(!str.empty()){

                    str.erase(0,str.find_first_not_of(" "));

                    str.erase(str.find_last_not_of(" ") + 1);

       }

}

删除所有的空格

void trimAllSpace(std::string & str){

      if(!str.empty()){

                 int index = 0;

                  while((index = str.find(' ',index)) != std::string::npos){

                            str.erase(index,1);

                    }

       }

}


版权声明:本文为qq_26105397原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。