21天学通C++之--String类的设计实现

来源:互联网 发布:男生背包推荐知乎 编辑:程序博客网 时间:2024/05/21 17:12
在c++中,自定义构造函数,运算符重载,析构函数,自定义函数,内存分配构成了这门语言知识的半壁江山,这里带给大家我的c++中string类的实现及要求


题目描述
模拟标准库字符串类实现你自己的字符串类。该类需具有构造,字符串连接、取子串和复制、赋值、输出等功能。要求使用动态分配存储字符串内容。不可使用STL string类


输入描述
测试程序有4个字符串,每个样例前两行含长度不超过200的俩字符串,赋值给前2个字符串对象,后面若干指令,每个指令占一行,分别由指令码和所需参数组成,空格分隔,每个指令码具有不同参数和意义; 指令有下述几种 : 指令P  i代表输出字符串i; 指令A  i j代表字符串i赋值给字符串j;  指令C i j  k 代表将字符串i和字符串j连接后赋值给字符串k; 指令F i s l k代表从字符串i位置s开始的长度为l的子串赋值给字符串k;所有操作指令和参数肯定是有校的。


输出描述
每个字符串输出占1行


输入样例
Hello
HDU
P 1
P 2
C 1 2 3
P 3
F 3 5 3 4
P 4


输出样例
Hello
HDU
HelloHDU
HDU




#include <iostream>
#include <iomanip>
using namespace std;


class String{
private:
    char *Data;
    int Length;
    
public:
    String();
    String(String &str);
    int GetLength() const;
    int GetStrLength(char* const &str)const;
    bool Resize(int const NewLength);
    String& operator=(char* const &str);
    String& operator=(String const &b);
    String operator+(String const &b);
    friend ostream& operator << (ostream& output,String& b);
    String GetSubString(int start,int length);
    ~String();
};


String::String(){
    Data=new char[2];
    Data[0]='\0';
    Length=0;
}


String::String(String &rpl){
    if(!this->Resize(rpl.Length)){
        cout<<"ERR"<<endl;
        return;
    }
    for(int i=0;i<Length;i++){
        this->Data[i]=rpl.Data[i];
    }
    this->Data[Length]='\0';
}


int String::GetLength() const{
    return Length;
}


int String::GetStrLength(char* const &str) const{
    char *tmp = str;
    while (*tmp!='\0')
    {
        tmp++;
    }
    return int(tmp-str);
}


bool String::Resize(int const NewLength){
    if(Data)
        delete[] Data;
    Data=new char[NewLength+1];
    Length=NewLength;
    return true;
}


String& String::operator=(char* const &str){
    if(!this->Resize(this->GetStrLength(str))){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<Length;i++){
        this->Data[i]=str[i];
    }
    this->Data[Length]='\0';
    return *this;
}


String& String::operator=(String const &b){
    if(!this->Resize(b.Length)){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<Length;i++){
        this->Data[i]=b.Data[i];
    }
    this->Data[Length]='\0';
    return *this;
}


String String::operator+(String const &b){
    String c;
    if(!c.Resize(this->Length+b.Length)){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<this->Length;i++){
        c.Data[i]=this->Data[i];
    }
    for(int i=0;i<b.Length;i++){
        c.Data[c.Length-b.Length+i]=b.Data[i];
    }
    c.Data[c.Length]='\0';
    return c;
}


ostream& operator << (ostream& output,String& b){
    if(b.Data!=0)
    output<<b.Data;
    return output;
}


String String::GetSubString(int start, int length){
    String c;
    char* SubString;
    SubString=new char[length+1];
    for(int i=0;i<length;i++){
        SubString[i]=this->Data[start+i];
    }
    c=SubString;
    c.Data[length]='\0';
    return c;
}


String::~String(){
    if(Data){
        delete[] Data;
        Data=NULL;
    }
}


int main() {
    char n[201],m[201];
    char comm;
    int i,j,k,l;
    String s[4];
    cin.getline(n,200);
    cin.getline(m,200);
    s[0]=n;
    s[1]=m;
    
    while(cin>>comm){
        switch (comm){
            case 'P':
                cin>>i;
                cout<<s[i-1]<<endl;
                break;
            case 'A':
                cin>>i>>j;
                s[j-1]=s[i-1];
                break;
            case 'C':
                cin>>i>>j>>k;
                s[k-1]=s[i-1]+s[j-1];
                break;
            case 'F':
                cin>>i>>j>>k>>l;
                s[l-1]=s[i-1].GetSubString(j, k);
                break;
            default:
                break;
        }
    }
    return 0;
}
0 1
原创粉丝点击