运算符重载
实现mystring中的一些功能
#include <iostream>
#include <cstring>
class MyString {
private:
char* data;
public:
// 构造函数
MyString(const char* str = "")
{
if (str)
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
else
{
data = new char[1];
*data = '\0';
}
}
// 析构函数
~MyString()
{
delete[] data;
}
// 赋值运算符重载
MyString &operator=(const MyString &other)
{
if (this != &other)
{
delete[] data;
data = new char[strlen(other.data) + 1];
strcpy(data, other.data);
}
return *this;
}
// +运算符符重载
MyString operator+(const MyString &other)
{
MyString result;
delete[] result.data;
result.data = new char[strlen(data) + strlen(other.data) + 1];
strcpy(result.data, data);
strcat(result.data, other.data);
return result;
}
//下标访问或修改字符
char& operator[](size_t index)
{
return data[index];
}
const char& operator[](size_t index)const
{
return data[index];
}
//清除内容clear
void clear()
{
delete[] data;
data =new char[1];
*data='\0';
}
// c_str成员函数
const char* c_str() const
{
return data;
}
//empty函数
void empty()
{
if(data[0]=='\0')
{
std::cout<<"字符串为空"<<std::endl;
}else
{
std::cout<<"字符串不为空"<<std::endl;
}
}
//size函数
int size()
{
int len=strlen(data);
return len;
}
//push_back函数
void push_back(char a)
{
int len=strlen(data);
char* newdata=new char[len+2];
strcpy(newdata,data);
newdata[len]=a;
newdata[len+1]='\0';
delete []data;
data=newdata;
}
//pop_back函数
void pop_back()
{
int len=strlen(data);
data[len-1]='\0';
}
//运算符>重载
bool operator>(const MyString &R)const
{
bool res=this->data>R.data;
return res;
}
//运算符>=重载
bool operator>=(const MyString &R)const
{
bool res=this->data>R.data||this->data==R.data;
return res;
}
//< <= 同理 不具体写了
//运算符!=重载
bool operator!=(const MyString &R) const
{
return !(this->data == R.data);
}
// 输出运算符重载有缘
friend std::ostream& operator<<(std::ostream& os, const MyString& s);
//==运算符重载有缘
friend bool operator==(const MyString& L,const MyString& R);
};
// 实现输出运算符重载
std::ostream& operator<<(std::ostream& os, const MyString& s)
{
os << s.data;
return os;
}
//==运算符重载
bool operator==(const MyString& L,const MyString& R)
{
return strcmp(L.data,R.data)==0;
}
int main() {
MyString s1("Hello");
MyString s2(" World");
MyString s3 = s1 + s2;
std::cout <<"s3字符串为:"<< s3 << std::endl; // 输出: Hello World
std::cout<<"s3[4]:"<<s3[4]<<std::endl;
std::cout<<"*******************************"<<std::endl;
//修改s3
s3[0]='w';
std::cout <<"修改后,s3字符串为:"<< s3 << std::endl;
std::cout<<"*******************************"<<std::endl;
//测试清除函数
std::cout<<"s2内容为:"<<s2<<std::endl;
s2.clear();
std::cout<<"执行clear后s2内容为:"<<s2<<std::endl;
std::cout<<"*******************************"<<std::endl;
//测试push_back,pop_back函数
std::cout<<"s1内容为:"<<s1<<std::endl;
s1.push_back(' ');
s1.push_back('a');
std::cout<<"执行push_back后s1内容为:"<<s1<<std::endl;
s1.pop_back(); //删去'a'
s1.pop_back(); //删去空格
std::cout<<"执行pop_back后s1内容为:"<<s1<<std::endl;
std::cout<<"*******************************"<<std::endl;
//测试empty函数
s1.empty();
std::cout<<"*******************************"<<std::endl;
//测试size函数
int len=s1.size();
std::cout<<"s1字符数为:"<<len<<std::endl;
std::cout<<"*******************************"<<std::endl;
//测试>
if(s1.size()>s2.size()) //s1.size()==5 s2.size()==0
{
std::cout<<"yes"<<std::endl;
}
else
{
std::cout<<"no"<<std::endl;
}
if(s1.size()>5) //s1.size()==5
{
std::cout<<"yes"<<std::endl;
}
else
{
std::cout<<"no"<<std::endl;
}
//测试>=
if(s1.size()>=5) //s1.size()==5
{
std::cout<<"yes"<<std::endl;
}
else
{
std::cout<<"no"<<std::endl;
}
//测试!=
if(s1.size()!=s2.size())
{
std::cout<<"yes"<<std::endl;
}
else
{
std::cout<<"no"<<std::endl;
}
return 0;
}