#include <iostream>
#include<string.h>
using namespace std;
class mystring
{
private:
char *str; //记录c风格的字符串
int size=0; //记录分配字符串的大小
int length=0; //记录字符串实际长度
public:
//****************************成员函数***************************
//构造函数:无参
mystring():size(10)
{
str=new char[size]; //申请空间
strcpy(str,"");
}
//构造函数:有参
mystring(const char *s)
{
size=strlen(s);
str=new char[size+1];
strcpy(str,s);
}
//析构函数
~mystring(){delete []str;}
//为字符串赋值 =
mystring &operator=(const mystring &other)
{
//防止自己给自己赋值
if(this == &other)
{
return *this;
}
//释放当前空间
delete[] str;
//重新分配内存
size = other.size;
str=new char[size];
//拷贝
strcpy(str,other.str);
//更新长度
length=other.length;
return *this;
}
//赋值运算符重载 +=
mystring &operator+=(const mystring &S)
{
int newlength=length + S.length; //计算添加后需要的长度
if(newlength>size) //先判断 原大小空间不足,则重新申请分配
{
size = size * 2; //二倍扩容
char *temp=new char[size]; //申请空间
strcpy(temp,str); //将原字符串复制
delete []str; //释放原字符串的空间
str = temp;
cout<<size<<endl;
}
strcat(str,S.str); //拼接
length=newlength;
cout<<size<<endl;
return *this;
}
//***********************元素访问************************
//元素访问at:访问指定字符
char &at(int index);
//访问指定字符
//返回指向字符串首字符的指针
//返回c风格
char *mystr_c_str()
{
return str;
}
//*************************容量****************************
//判空
bool mystr_empty();
//容量大小
int mystr_size();
//当前实际长度
int mystr_length();
//返回当前对象分配的存储空间能保存的字符数量
int mystr_capacity();
//*************************操作***********************
//清除内容
void mystr_clear();
//operator+
//operator==
//operator!=
//operator<
bool operator<( mystring &R)
{
return strcmp(this->mystr_c_str(),R.mystr_c_str())<0;
}
//operator>
bool operator>( mystring &R)
{
return strcmp(this->mystr_c_str(),R.mystr_c_str())>0;
}
//operator<=
bool operator<=( mystring &R)
{
return strcmp(this->mystr_c_str(),R.mystr_c_str())<=0;
}
//operator>=
bool operator>=( mystring &R)
{
return strcmp(this->mystr_c_str(),R.mystr_c_str())>=0;
}
//*********************展示*************************
void show()
{
cout<<str<<endl;
}
//输入输出 友元
friend ostream &operator>>(ostream &L,mystring &R);
friend istream &operator<<(istream &L,mystring &R);
};
char &mystring::at(int index)
{
if(index<0 || index>=length)
{
cout<<"error"<<endl;
}
return str[index];
}
//*********************容量************************
//判空
bool mystring::mystr_empty()
{
return strlen(str)==0;
}
//容量大小
int mystring::mystr_size()
{
return size;
}
//当前实际长度
int mystring::mystr_length()
{
length=strlen(str);
return length;
}
//输入函数
ostream &operator>>(ostream &L,mystring &R)
{
L<<R.str;
return L;
}
//输出函数
istream &operator<<(istream &L,mystring &R)
{
L>>R.str;
return L;
}
//************************主函数*************************
int main()
{
mystring my1("ni hao");
mystring my2("1234");
my1+=my2;
my1.show();
cout<<my1.mystr_size()<<endl;
cout<<my1.mystr_length()<<endl; //10
mystring my3;
my3=my1;
my3.show();
return 0;
}
思维导图