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

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4 class String{
  5 public:
  6     //默认构造函数
  7     String(const char* str=NULL);
  8     //复制构造函数
  9     String(const String &str);
 10     //析构函数
 11     ~String();
 12     //字符串连接
 13     String operator+(const String & str);
 14     //字符串赋值
 15     String & operator=(const String & str);
 16     //字符串赋值
 17     String & operator=(const char* str);
 18     //判断字符串是否相等
 19     bool operator==(const String & str);
 20     //获取字符串长度
 21     int length();
 22     //求子字符串[start,start+-1]
 23     String substr(int start,int n);
 24     //重载输出
 25     friend ostream & operator<<(ostream & o,const String & str);
 26 private:
 27     char * data;
 28     int size;
 29 };
 30 //构造函数
 31 String::String(const char *str){
 32     if(str==NULL){
 33         data=new char[1];
 34         data[0]='\0';
 35         size=0;
 36     }else{
 37         size=strlen(str);
 38         data=new char[size+1];
 39         strcpy(data,str);
 40     }
 41     cout<<str<<"构造"<<endl;
 42 }
 43 //复制构造函数
 44 String::String(const String & str){
 45     size=str.size;
 46     data=new char[size+1];
 47     cout<<str<<"拷贝"<<endl;
 48     strcpy(data,str.data);
 49 }
 50 //析构函数
 51 String::~String(){
 52     delete[] data;
 53 }
 54 //字符串连接
 55 String String::operator+(const String & str){
 56     String newStr;
 57     //释放原有空间
 58     delete[] newStr.data;
 59     newStr.size=size+str.size;
 60     newStr.data=new char[newStr.size+1];
 61     strcpy(newStr.data,data);
 62     strcpy(newStr.data+size,str.data);
 63     return newStr;
 64 }
 65 //字符串赋值
 66 String & String::operator=(const String &str){
 67     if(data==str.data){
 68         return *this;
 69     }
 70     delete[] data;
 71     size=str.size;
 72     data=new char[size+1];
 73     strcpy(data,str.data);
 74     cout<<str<<"赋值"<<endl;
 75     return *this;
 76 }
 77 //字符串赋值
 78 String & String::operator=(const char* str){
 79     if(data==str){
 80         return *this;
 81     }
 82     delete[] data;
 83     size=strlen(str);
 84     data=new char[size+1];
 85     strcpy(data,str);
 86     cout<<str<<"赋值"<<endl;
 87     return *this;
 88 }
 89 //判断是否字符串相等
 90 bool String::operator==(const String &str){
 91     return strcmp(data,str.data)==0;
 92 }
 93 //获取字符串长度
 94 int String::length(){
 95     return size;
 96 }
 97 //求子字符串[start,start+n-1]
 98 String String::substr(int start,int n){
 99     String newStr;
100     delete[] newStr.data;
101     newStr.data=new char[n+1];
102     for(int i=0;i<n;++i){
103         newStr.data[i]=data[start+i];
104     }
105     newStr.data[n]='\0';
106     newStr.size=n;
107     return newStr;
108 }
109 //重载输出
110 ostream & operator<<(ostream &o,const String & str){
111     o<<str.data;
112     return o;
113 }
114 int main(){
115     String str1("Hello ");
116     String str2=str1;
117     str2=str1;
118     return 0;
119 }

 

posted @ 2019-07-07 21:37  知了会爬树  阅读(506)  评论(0编辑  收藏  举报