算术运算符:+
赋值运算符:+=
下标运算符:[]
关系运算符:>、=、
插入提取运算符:>
要求:注意数据的保护(const)
代码实现
#include <iostream>
#include<string.h>
#include <cstring>
using namespace std;
class My_string
{
private:
char *data;
int size;
public:
//无参构造默认长度为15
My_string():size(15)
{
data = new char[size];
data[0] = '\0';
cout<<"无参构造"<<endl;
}
//有参构造
My_string(const char *str)
{
size=sizeof (str);
data = new char[size];
strcpy(data,str);
cout<<"有参构造"<<endl;
}
My_string(int n, char ch)
{
data = new char[n];
size=n;
for(int i=0;i<n;i++)
{
data[i]=ch;
}
cout<<"有参构造1"<<endl;
}
//析构函数
~My_string()
{
delete []data;
data=nullptr;
cout<<"析构函数"<<endl;
}
//拷贝构造函数
My_string(const My_string &other):data(new char[other.size]),size(other.size)
{
strcpy(data,other.data);
cout<<"拷贝构造函数"<<endl;
}
//拷贝赋值函数
My_string &operator=(const My_string &other)
{
if(other.size >size)
{
delete []data;
data = new char[other.size];
}
strcpy(data,other.data);
size = other.size;
cout<<"拷贝赋值函数"<<endl;
return *this;
}
//c_str函数
const char *c_str()
{
return data;
}
//size函数
int s_size()
{
return strlen(this->data);
}
//empty函数
bool empty()
{
return data[0] == 0;
}
//at函数
char &at(int n)
{
return data[n];
}
//>号运算符重载
bool operator>(const My_string &R)const
{
cout<<"data:"<<data<<" R:data:"<<R.data<<endl;
return strcmp(data,R.data) > 0;
}
//<号运算符重载
bool operator<(const My_string &R)const
{
return strcmp(data,R.data) < 0;
}
//==号运算符重载
bool operator==(const My_string &R)const
{
return strcmp(data,R.data) == 0;
}
//!= 号运算符重载
bool operator!=(const My_string &R)const
{
return strcmp(data,R.data) != 0;
}
//>=号运算符重载
bool operator>=(const My_string &R)const
{
return strcmp(data,R.data) >= 0;
}
//<= 号运算符重载
bool operator<=(const My_string &R)const
{
return strcmp(data,R.data) <= 0;
}
//插入<<运算符
friend ostream &operator<<(ostream &L,const My_string &R)
{
L<<R.data;
return L;
}
//提取>>运算符
friend istream &operator>>(istream &L,My_string &R)
{
L>>R.data;
return L;
}
//+号运算符重载,字符串拼接
My_string operator+(const My_string &R)const
{
My_string s;
delete []s.data;
s.data = new char[strlen(data)+strlen(R.data)+1];
strcpy(s.data,this->data);
strcat(s.data,R.data);
s.size = strlen(s.data);
return s;
}
//+=号运算符重载
My_string & operator+=(const My_string &R)
{
char *d = new char[strlen(this->data)+strlen(R.data)];
strcpy(d,this->data);
strcat(d,R.data);
delete []data;
data = d;
size = strlen(data);
return *this;
}
//[]号运算符重载
char & operator[](int n)
{
if(n < 0 || n > this->size)
cout<<"下标非法"<<endl;
return this->data[n];
}
void show()
{
cout<<"data : "<<data<<endl;
}
};
int main()
{
My_string s1("hello");
cout<<endl;
My_string s2(10,'A');
cout<<endl;
My_string s3 = s2;
My_string s4 ;
s4=s1;
s4.show();
s1+=s2;
s1.show();
cout<<endl;
return 0;
}
执行结果