还没写完
#include <iostream>
#include <cstring>
using namespace std;class myString
{
private:char *str; //字符串int size; //实际字符长度int len; //字符串容量
public:myString():size(10) //无参构造函数{len = size + 1;str = new char[size];}myString(const char*s):size(strlen(s)) //有参构造函数{//cout<<size<<endl;len = size + 1;str = new char[size+1];strcpy(str,s);}~myString() //析构函数{delete []str;}myString &operator=(const myString &R); //=重载char &at(const int &index); //atchar &operator[](const int &index); //下标重载char *data(); //datachar *c_str(); //c_strbool empty(); //判空int sszie(); //字符实际长度int capcity(); //字符串容量void clear(); //清空void push_back(const char &s); //尾插1个字符void pop_back(); //尾删1个字符void expand(); //二倍扩容myString &operator+=(const myString &R); //+=重载myString &operator+(const myString &R);myString &operator+(const char &R);void show(); //展示
};
//=
myString & myString:: operator=(const myString &R)
{/*delete [] str;size = R.size;len = R.len;char *newstr = new char[len];strcpy(newstr,R.str);str = newstr;*/size = R.size;len = R.len;char *newstr = new char[len];strcpy(newstr,R.str);delete [] str;str = newstr;return *this;
}
//at
char &myString :: at(const int &index)
{if(index > size || index < 0) //判断是否下标越界{cout<<"下标越界"<<endl;exit(0);}return str[index];
}//[]
char &myString::operator[](const int &index)
{return str[index];
}
//data
char *myString ::data()
{return &str[0];
}
//c_str
char *myString :: c_str()
{return str;
}
//empty
bool myString::empty()
{return size==0;
}
//ssize
int myString::sszie()
{return size;
}
//capcity
int myString::capcity()
{return len;
}
//clear
void myString::clear()
{
// delete [] str;
// str = new char[size+1];memset(str,0,size+1);
}
//show
void myString ::show()
{
// cout<<size<<endl;
// cout<<strlen(str)<<endl;cout<<str<<endl;
}
//尾插
void myString::push_back(const char &s)
{if((size + 1) >= len) //判断是否需要二倍扩容{expand();}str[size] = s;size++;str[size] = '\0';
}
//尾删一个字符
void myString::pop_back()
{str[size-1] = 0;size--;
}
//+=
myString & myString::operator+=(const myString &R)
{while(size + int(strlen(R.str)) >= len){expand();}strcat(this->str,R.str);return *this;
}
//二倍扩容
void myString::expand()
{len = len * 2 - 1;char*newstr = new char[len];memset(newstr,0,len);strcpy(newstr,str);delete []str;str = newstr;
}
//+
myString &myString::operator+(const myString &R) //两个字符串相加
{while((size + R.size) >= len){expand();}strcat(str,R.str);size = size + R.size;return *this;
}
myString &myString::operator+(const char &R) //字符串和单个字符相加
{if(size + 1 >= len){expand();}push_back(R);return *this;
}
int main()
{myString s1("nihao");myString s2("hello world");s1 = s2;s1.show();cout<<s1.at(1)<<endl;s1[0] = 'H';s1.show();s1.push_back('!');s1.show();s1.pop_back();s1.show();myString s3;s3 = s1 + s2 + s2;s3.show();cout<<"**************"<<endl;s3 = s3 + '?' + '!';s3.show();s1.clear();s1.show();s1.at(-1);return 0;
}