自己设计一个字符串类 Mystring

要求:
1、两个Mystring 类型的对象能相加、相减。
2、Mystring 有一个char *类型私有成员指针。
3、数据来源于键盘输入。
例如:
Mystring p = “hello world”
Mystring q = “wo”
p + q ==> hello world wo
p - q ==> hello rld

众所周知,string函数可以实现 字符串的相加或相减,此题要求我们自己用运算符重载的方式来设计一个我们自己的string函数(简称Mystring)。
那么为什么需要运算符重载呢?
函数可以重载,运算符也能重载。
c++中预定义的操作符对象只能是基本数据类型,但实际上对于很多用户自定义的类型(例如类),也需要类似的运算操作,这时就必须在c++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定的类型执行特定的操作。
所以,常规的运算符只能执行int、double、long等基本数据类型,却不能实现字符串的运算,这时就需要重载运算符,此题示例代码如下:

#include
using spacename std;

class Mystring{
public:
Mystring();
~Mystring();
friend istream & operator >> (istream &in, Mystring &a);
friend ostream & operator << (ostream &in, Mystring &a);
friend Mstring & operator + (Mstring &s1, Mystring &s2);
friend char * operator - (Mstring &s1, Mystring &s2);//重载减号运算符,是本题的难点。

private:
char *str;
};
Mystring::Mystring()
{
str = new char[32];
}
Mystring::~Mystring()
{
delete [ ] str;
}
istream & operator >> (istream &in, Mystring &a)
{
in >> a.str;
return in;
}
ostream & operator << (ostream &in, Mystring &a)
{
in << a.str;
return in;
}
Mstring & operator + (Mstring &s1, Mystring &s2)
{
strcat(s1.str, s2.str);
return s1;
}
char * operator - (Mstring &s1, Mystring &s2)
{
char *p = s1.str;
while (*p)
{
if(strncmp(p, s2.str, strlen(s2.str)) == 0)//如果s1.str与s2.str中有相同的字符
{
char *q = p;
while(*q){
*q = *(q + strlen(s2.str));
q++;
}
p -= 2; // 指针向前移两位
}
p++;
}
return si.str;
}
int main(int argc,char *argv[])
{
Mystring a;
Mystring b;

cin >> a >> b;
cout << a + b << endl;
cout << a - b << endl;
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Mystring 设计: ```cpp class Mystring { private: char* str; int len; public: Mystring() : str(nullptr), len(0) {} Mystring(const char* s) : str(nullptr), len(0) { if (s) { len = strlen(s); str = new char[len + 1]; strcpy(str, s); } } Mystring(const Mystring& rhs) : str(nullptr), len(rhs.len) { if (rhs.str) { str = new char[len + 1]; strcpy(str, rhs.str); } } ~Mystring() { delete[] str; } Mystring& operator=(const Mystring& rhs) { if (this != &rhs) { delete[] str; len = rhs.len; if (rhs.str) { str = new char[len + 1]; strcpy(str, rhs.str); } else { str = nullptr; } } return *this; } Mystring& operator+=(const Mystring& rhs) { int newlen = len + rhs.len; char* newstr = new char[newlen + 1]; if (str) { strcpy(newstr, str); delete[] str; } strcpy(newstr + len, rhs.str); str = newstr; len = newlen; return *this; } friend Mystring operator+(Mystring lhs, const Mystring& rhs) { lhs += rhs; return lhs; } char operator[](int index) const { if (index < 0 || index >= len) { throw std::out_of_range("Mystring out of range"); } return str[index]; } char& operator[](int index) { if (index < 0 || index >= len) { throw std::out_of_range("Mystring out of range"); } return str[index]; } const char* c_str() const { return str ? str : ""; } int length() const { return len; } // 可以根据需要添加其他函数或运算符重载 }; ``` 这个包含了一些常用的字符串操作,例如构造函数、拷贝构造函数、析构函数、赋值运算符、加法运算符、下标运算符、c_str() 函数和 length() 函数等等。其中,c_str() 函数返回一个指向字符串的指针,length() 函数返回字符串的长度。需要注意的是,这个中使用了动态内存分配,因此需要特别注意内存泄漏和内存安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值