实现my_string中可能实现的功能
#include <iostream>
#include<cstring>
using namespace std;
class my_string
{char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacit;//记录最大容量public://无参的构造函数my_string():size(0),capacit(15){str = new char[capacit];}// 带参数的构造函数my_string(const char *s):capacit(15) {size = strlen(s) ;if(size>capacit){extend();}str = new char[capacit];strcpy(str, s);}//拷贝构造函数my_string(const my_string &other):str(new char[other.capacit]),size(other.size),capacit(other.capacit){strcpy(str,other.str);cout<<"拷贝构造函数"<<endl;}//移动构造函数my_string(const my_string &&other):str(new char[other.capacit]),size(other.size){strcpy(str,other.str);cout<<"拷贝构造函数"<<endl;}//拷贝赋值函数my_string &operator=(const my_string&other){if(this!=&other){size=other.size;capacit=other.capacit;str=new char[capacit];strcpy(str,other.str);}cout<<"拷贝赋值函数"<<endl;return *this;}//移动赋值函数my_string &operator=(const my_string &&other){if(this!=&other){size=other.size;capacit=other.capacit;str=new char[capacit];strcpy(str,other.str);}cout<<"拷贝赋值函数"<<endl;return *this;}~my_string(){delete []str;}friend bool operator<=(const my_string &L,const my_string &R);friend bool operator>=(const my_string &L,const my_string &R);friend istream &operator>>(istream &L,my_string &R);friend ostream &operator<<(ostream &L,const my_string &R);friend bool operator>(const my_string &L,const my_string &R);friend bool operator<(const my_string &L,const my_string &R);friend bool operator!=(const my_string &L,const my_string &R);friend bool operator==(const my_string &L,const my_string &R);friend const my_string operator+(const my_string &L,const my_string &R);bool my_string_empty();//判空函数int str_size(); //字符串长度char * my_c_ctl(){//将c++的字符串转化为c风格的字符串return str;}char &at(int pos){//仿at功能return str[pos];}void extend();//二倍扩容void show();int capacity(){return this->capacit;}//清空字符串void clear(){str[0]='\0';}//push_backvoid push_back(char a){if(size>=capacit){extend();}str[this->size]=a;size++;}//pop_backbool pop_back(){if(size==0){ return false;}str[size-1]='\0';size--;return true;}//运算符+=重载函数void operator+=(char a);
};
void my_string::operator+=(char a){if(size>=capacit){extend();}str[this->size]=a;size++;
}
void my_string::extend(){char *arg;arg=new char[capacit*2+1];//在堆区申请一个两倍capacity大小的空间strcpy(arg,str);//将原先str字符串复制到arg中;delete []str;//删除原先的在堆区的strstr=arg;
}
void my_string::show(){cout<<str<<endl;
}
bool my_string::my_string_empty(){//判空函数if(strlen(str)==0){return true;}elsereturn false;
}
int my_string::str_size(){ //字符串长度return strlen(str);
}
//运算符+重载函数
const my_string operator+(const my_string &L,const my_string &R){my_string temp;temp.size = L.size + R.size;temp.capacit=L.capacit;if(temp.size>=temp.capacit){temp.extend();}temp.str = new char[temp.capacit];strcpy(temp.str, L.str);strcat(temp.str, R.str);return temp;
}//运算符==重载函数
bool operator==(const my_string &L,const my_string &R){return strcmp(L.str,R.str)==0;
}
//运算符!=重载函数
bool operator!=(const my_string &L,const my_string &R){return strcmp(L.str,R.str)!=0;
}
//运算符>重载函数
bool operator>(const my_string &L,const my_string &R){return strcmp(L.str,R.str)>0;
}
//运算符>=重载函数
bool operator>=(const my_string &L,const my_string &R){return strcmp(L.str,R.str)>=0;
}
//运算符<=重载函数
bool operator<=(const my_string &L,const my_string &R){return strcmp(L.str,R.str)<=0;
}
//运算符<重载函数
bool operator<(const my_string &L,const my_string &R){return strcmp(L.str,R.str)<0;
}
//<<重载函数
ostream &operator<<(ostream &L,const my_string &R){L<<R.str<<endl;return L;
}
//>>重载函数
istream &operator>>(istream &L,my_string &R){L>>R.str;R.size=strlen(R.str);return L;
}
int main()
{my_string s1("aaa");my_string s2(s1);s2.show();cout<<"********************************"<<endl;my_string s3;s3=s2;s3.show();cout<<"********************************"<<endl;my_string s4=s1+s2;s4.show();cout<<"********************************"<<endl;if(s4!=s1){cout<<"yes"<<endl;}else{cout<<"no"<<endl;}cout<<"********************************"<<endl;my_string s5="abcd";cout<<s5;cout<<"********************************"<<endl;my_string s6;cin>>s6;cout<<s6;cout<<"********************************"<<endl;s6.push_back('a');cout<<s6;cout<<"********************************"<<endl;s6.clear();cout<<s6;cout<<"********************************"<<endl;cout<<s5.capacity();return 0;
}