64,281
社区成员
发帖
与我相关
我的任务
分享
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Mystring
{
private:
char *pstr;
int length;
public:
Mystring(char*s);
Mystring(Mystring &mystring);
~Mystring();
// 返回值修改为Mystring&
Mystring& operator+=(const Mystring &str);
Mystring& operator=(const Mystring &string);
friend bool operator== (const Mystring& string1, const Mystring& string2);
friend bool operator!= (const Mystring& string1, const Mystring& string2);
friend bool operator> (const Mystring& string1, const Mystring& string2);
friend bool operator< (const Mystring& string1, const Mystring& string2);
char& operator[](int n);
char operator[](int n) const;
friend ostream &operator<<(ostream &os, const Mystring &string);
friend istream &operator >> (istream &is, Mystring &string);
};
Mystring::Mystring(char * s)
{
length = strlen(s);
pstr = new char[length + 1];
strcpy(pstr, s);
}
Mystring::Mystring(Mystring & mystring)
{
cout << "调用拷贝构造函数" << endl;
this->pstr = new char[mystring.length + 1];
strcpy(pstr, mystring.pstr);
length = mystring.length;
}
Mystring::~Mystring()
{
delete pstr;
cout << "调用析构函数" << endl;
system("pause");
}
Mystring& Mystring::operator+=(const Mystring & string)
{
int n = length;
length += string.length;
char* temp = new char[length + 1];
int i;
for (i = 0; i <= length; i++)
{
if (i < n)
{
temp[i] = pstr[i];
}
else if (i >= n)
{
temp[i] = string.pstr[i - n];
}
}
delete pstr;
//pstr = new char[length + 1];
//strcpy(pstr, temp);
pstr = temp;
this->length = length;
cout << "调用+=重载" << endl;
return *this;
}
Mystring& Mystring::operator=(const Mystring & string)
{
// 增加自我赋值的判断
if (this == &string)
return *this;
delete this->pstr;
this->pstr = new char[string.length + 1];
strcpy_s(this->pstr, string.length + 1, string.pstr);
this->length = string.length;
return *this;
}
bool operator==(const Mystring & string1, const Mystring & string2)
{
//return (string1.pstr == string2.pstr);
return strcmp(string1.pstr, string2.pstr) == 0;
}
bool operator!=(const Mystring & string1, const Mystring & string2)
{
//return !(string1.pstr == string2.pstr);
return strcmp(string1.pstr, string2.pstr) != 0;
}
bool operator>(const Mystring & string1, const Mystring & string2)
{
//return (string1.pstr > string2.pstr);
return strcmp(string1.pstr, string2.pstr) > 0;
}
bool operator<(const Mystring & string1, const Mystring & string2)
{
//return (string1.pstr < string2.pstr);
return strcmp(string1.pstr, string2.pstr) < 0;
}
char & Mystring::operator[](int n)
{
static char ch = 0;
if (n >= length || n < 0)
{
cout << "Out of the bond!" << endl;
return ch;
}
else
return *(pstr + n);
}
char Mystring::operator[](int n) const
{
static char ch = 0;
if (n >= length || n < 0)
{
cout << "Out of the bond!" << endl;
return ch;
}
else
return *(pstr + n);
}
ostream & operator<<(ostream & os, const Mystring & string)
{
os << "String: " << string.pstr << '\t' << " Length: " << string.length;
return os;
}
istream & operator >> (istream & is, Mystring & string)
{
// 最多输入2048长度的字符串,在真实情况这里是不可限定的
char *tmp = new char[2048];
is >> tmp;
delete string.pstr;
int len = strlen(tmp);
string.pstr = new char[len + 1];
strcpy(string.pstr, tmp);
string.length = len;
return is;
}
int main()
{
Mystring mystring1("hdjs");
cout << mystring1 << endl;
Mystring mystring2("shddsi");
cout << mystring2 << endl;
cout << "请重新为mystring2输入:";
cin >> mystring2;
cout << mystring2 << endl;
mystring1 += mystring2;
cout << "连接两个字符串:";
cout << mystring1 << endl;
system("pause");
return 0;
}
istream & operator >> (istream & is, Mystring & string)
{
delete string.pstr;
is >> string.pstr;
string.length = strlen(string.pstr);
eturn is;
}
代码问题很多,这里你delete调了 string.str,指针是没有内存分配的,再用流往里面写东西的话会把内存搞乱的,后面就崩溃了。