主要完成以下任务:
1)数据成员是字符指针,可自动适应不同的串长度。
2)串复制,既可使用字符串常量进行复制,也可以使用其他的字符串对象进行复制。
3)串赋值。既可赋值为字符串常量,也可以赋值为使用其他的字符串对象。
4)串连接。重载“+”和“+=”。
5)重载下标运算符[]。
6)串比较。重载“==”和“<”。
7)字符串输入和输出。重载“>>”和“<<”。
程序重点在于运算符重载,以及解决空指针,自赋值问题!
改进,可将字符串长度定义为数据成员,这样就不用每次都用strlen计算长度!若需要定义为数据成员的代码,私我!
程序代码:
#include<iostream>
#include<cstring>
using namespace std;
class String {
private:
char * Pstr;
public:
String(const char* p = NULL) {
if (p == NULL) {
Pstr = new char[1];
*Pstr = '\0';
} else {
Pstr = new char[strlen(p) + 1];
strcpy(Pstr, p);
}
}
String(const String& s): Pstr(new char[strlen(s.Pstr) + 1]) {
strcpy(Pstr, s.Pstr);
}
~String() {
if (Pstr)
delete[] Pstr;
}
String& operator=(const String& s) {
if (Pstr == s.Pstr)
return *this;
else if (NULL == this) {
delete Pstr;
Pstr = new char[strlen(s.Pstr) + 1];
strcpy(Pstr, s.Pstr);
} else {
strcpy(Pstr, s.Pstr);
}
return *this;
}
friend ostream & operator<<(ostream &out, const String &s) {
out << s.Pstr;
return out;
}
friend istream & operator >>(istream &in, String &s) {
in >> s.Pstr;
if(in)
return in;
}
String operator+(const String &s2) {
char *p=new char[strlen(Pstr) + strlen(s2.Pstr)+1];
p=strcat(Pstr,s2.Pstr);
return String(p);
}
void operator+=(const String &s2) {
strcat(Pstr, s2.Pstr);
}
char& operator[](int n) {
return Pstr[n];
}
int Length() {
int n=strlen(Pstr) ;
return n;
}
bool operator==(const String &s2) {
return strcmp(Pstr, s2.Pstr) == 0;
}
bool operator<(const String &s2) {
return strcmp(Pstr, s2.Pstr) < 0;
}
};
提供一个main测试函数
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;
cout << boolalpha << (s3 < s1) << endl;
return 0;
}
运行截图
有收获的小可爱记得点关注哦!嘿嘿!