class String
{ //友原重载<<和>>
friend ostream& operator<<(ostream& out, const String& s);
friend istream& operator>>(istream& in, String& s);
public:
String() {
str = new char[100];
str[0] = '\0';
}//string的默认构造
String(const char* other)
{
str = new char[strlen(other) + 1];
strcpy(str, other);
}//有参构造
~String()
{
delete[]str;
}//析构
String(const String& other);//复制构造
int Length();//字符串的长度
String& operator=(const String& other);
String& operator=(const char* ch);//重载=
String operator+(const String& other);//重载+
String& operator+=(const String& other);//重载+=
char& operator[](int x);//重载[]
bool operator==(const String& other);//重载==
bool operator<(const String& other);//重载<
private:
char* str;
};
friend ostream& operator<<(ostream& out, const String& s);
friend istream& operator>>(istream& in, String& s);
ostream& operator<<(ostream& out, const String& s)
{
out << s.str;
return out;
}
istream& operator>>(istream& in, String& s)
{
char ch[1000];//临时创造一个数组储存输入值
in >> ch;
delete[]s.str;//释放s的空间
s.str = new char[strlen(ch) + 1];//为s重新分配新的空间
strcpy(s.str, ch);//赋值给s
return in;
}
String(const String& other);
String::String(const String& other)
{
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
int Length();
int String::Length()
{
return strlen(str);//返回str的长度
}
String& operator=(const String& other);
String& operator=(const char* ch);
String& operator=(const String& other)
{
if (this != &other)//判断是否和原来一样,一样直接返回原值
{
delete[]str;
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
return *this;
}//重载与string的=
String& operator=(const char* ch)
{
delete[]str;
str = new char[strlen(ch) + 1];
strcpy(str, ch);
return *this;
}//重载与字符串的=
String operator+(const String& other);
String operator+(const String& other)
{
int len = strlen(str) + strlen(other.str) + 1;
//求出需要开辟空间的大小
char* newstr = new char[len];//用一个新指针去接收
strcpy(newstr, str);
strcat(newstr, other.str);
return String(newstr);
}//重载+
String& operator+=(const String& other);
String& operator+=(const String& other)
{
*this = *this + other;
return *this;
}//使用重载后的=和+完成+=的重载
char& operator[](int x);
bool operator==(const String& other);
bool operator<(const String& other);
char& operator[](int x)
{
assert(x >= 0 && x <= strlen(str));
//使用断言判断是否在范围内
return str[x];
}//重载[]
bool operator==(const String& other)
{
return !strcmp(str, other.str);
}//重载==
bool operator<(const String& other)
{
return strcmp(str, other.str) < 0;
}//重载<
完整代码及样例的使用
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
class String
{ //友原重载<<和>>
friend ostream& operator<<(ostream& out, const String& s);
friend istream& operator>>(istream& in, String& s);
public:
String() {
str = new char[100];
str[0] = '\0';
}//string的默认构造
String(const char* other)
{
str = new char[strlen(other) + 1];
strcpy(str, other);
}//有参构造
~String()
{
delete[]str;
}//析构
String(const String& other);//复制构造
int Length();//字符串的长度
String& operator=(const String& other)
{
if (this != &other)
{
delete[]str;
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
return *this;
}//重载与string的=
String& operator=(const char* ch)
{
delete[]str;
str = new char[strlen(ch) + 1];
strcpy(str, ch);
return *this;
}//重载与字符串的=
String operator+(const String& other)
{
int len = strlen(str) + strlen(other.str) + 1;
char* newstr = new char[len];
strcpy(newstr, str);
strcat(newstr, other.str);
return String(newstr);
}//重载+
String& operator+=(const String& other)
{
*this = *this + other;
return *this;
}//使用重载后的=和+完成+=的重载
char& operator[](int x)
{
assert(x >= 0 && x <= strlen(str));
return str[x];
}//重载[]
bool operator==(const String& other)
{
return !strcmp(str, other.str);
}//重载==
bool operator<(const String& other)
{
return strcmp(str, other.str) < 0;
}//重载<
private:
char* str;
};
String::String(const String& other)
{
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
ostream& operator<<(ostream& out, const String& s)
{
out << s.str;
return out;
}
istream& operator>>(istream& in, String& s)
{
char ch[1000];
in >> ch;
delete[]s.str;
s.str = new char[strlen(ch) + 1];
strcpy(s.str, ch);
return in;
}
int String::Length()
{
return strlen(str);
}
int main()
{
String s1("Help!"), s2("Good!"), s3(s2), s4, s5;
cout << "s1=" << s1 << endl;
s3 = "Hello!";
cout << "s3=" << s3 << endl;
s3 = s2;
cout << "s3=" << s3 << endl;
s3 += s2;
cout << "s3=" << s3 << endl;
cin >> s4;
cout << "s4=" << s4 << endl;
s5 = s3 + s4;
cout << "s5=" << s5 << endl;
s5[0] = 'g';
cout << "s5=" << s5 << endl;
cout << "strlen(s5)=" << s5.Length() << endl;
cout << boolalpha << (s3 == s1) << endl;
//利用boolalpha来断真假
cout << boolalpha << (s3 < s1) << endl;
}