字符串类 #include <iostream>using namespace std;class String{public: // constructors String(); String(const char* const); String(const String&); ~String(); // overloaded operators char& operator [](unsigned short offset); char operator [](unsigned short offset) const; String operator +(const String&); void operator += (const String&); String& operator = (const String&); // general accessors unsigned short GetLen() const { return itsLen; } const char* GetString() const { return itsString; }private: String(unsigned short); // private constructor char* itsString; unsigned short itsLen;};/**/////////////////////////////////////////////////////////////////////// 构造函数String::String() { itsString = new char[1]; itsString[0] = '\0'; itsLen = 0;}String::String(unsigned short len) { itsString = new char[len + 1]; for (unsigned short i = 0; i <= len; i++) itsString[i] = '\0'; itsLen = len;}String::String(const char* const cString) { itsLen = strlen(cString); itsString = new char[itsLen + 1]; for (unsigned short i = 0; i < itsLen; i++) itsString[i] = cString[i]; itsString[itsLen] = '\0';}String::String(const String& rhs) { itsLen = rhs.GetLen(); itsString = new char[itsLen + 1]; for (unsigned short i = 0; i < itsLen; i++) itsString[i] = rhs[i]; // 这里的访问操作符在后面要实现之。 itsString[itsLen] = '\0';}String::~String() { delete [] itsString; itsLen = 0;}/**////////////////////////////////////////////////////////////////////////// 以下实现自定义的操作符重载String& String::operator = (const String& rhs) { // 重要的判断! if (this == &rhs) return *this; delete [] itsString; itsLen = rhs.GetLen(); itsString = new char[itsLen + 1]; for (unsigned short i = 0; i < itsLen; i++) itsString[i] = rhs[i]; itsString[itsLen] = '\0'; return *this;}char& String::operator [](unsigned short offset) { if (offset > itsLen) return itsString[itsLen - 1]; else return itsString[offset];}char String::operator [](unsigned short offset) const { if (offset > itsLen) return itsString[itsLen - 1]; else return itsString[offset];}String String::operator +(const String& rhs) { unsigned short totalLen = itsLen + rhs.GetLen(); String temp = String(totalLen); unsigned short i, j; for (i = 0; i < itsLen; i++) temp[i] = itsString[i]; for (j = 0; j < rhs.GetLen(); i++, j++) temp[i] = rhs[j]; temp[totalLen] = '\0'; return temp;}void String::operator += (const String& rhs) { unsigned short rhsLen = rhs.GetLen(); unsigned short totalLen = itsLen + rhsLen; String temp(totalLen); unsigned short i, j; for (i = 0; i < itsLen; i++) temp[i] = itsString[i]; for (j = 0; j < rhsLen; i++, j++) temp[i] = rhs[j]; temp[totalLen] = '\0'; *this = temp; }int main(int argc, char *argv[]){ String s1("initial test"); cout << "s1: \t" << s1.GetString() << endl; char* temp = "Hello World"; s1 = temp; cout << "s1: \t" << s1.GetString() << endl; char tempTwo[20]; strcpy(tempTwo, "; nice to be here!"); s1 += tempTwo; cout << "tempTwo: \t" << tempTwo << endl; cout << "s1: \t" << s1.GetString() << endl; cout << "s1[4]: \t" << s1[4] << endl; s1[4] = 'x'; cout << "s1: \t" << s1.GetString() << endl; cout << "s1[999]: \t" << s1[999] << endl; String s2("Another string"); String s3; s3 = s1 + s2; cout << "s3: \t" << s3.GetString() << endl; String s4; s4 = "Why does this work?"; cout << "s4: \t" << s4.GetString() << endl; return 0;}