#include<iostream> #include<string> using namespace std; class CString; ostream& operator << (ostream&output,const CString&); class CString { friend ostream& operator << (ostream&,const CString&); private: char *s; public: CString(const char*str=NULL); ~CString(); CString&operator + (CString&str); CString&operator = (const CString&str); char&operator [](int i); }; CString::CString(const char*str) //拷贝构造 { if(str==NULL) { s=new char[1]; s='/0'; } else { int longth=strlen(str); s=new char[longth+1]; strcpy(s,str); } } CString::~CString() { if(s!=NULL) { delete [] s; s = NULL; } } CString& CString::operator + (CString &str) { if(str.s==NULL) return *this; else { int length=strlen(str.s)+strlen(s)+1; char *tmp = new char[length]; strcpy(tmp,str.s); strcat(s, tmp); delete []tmp; return *this; } } CString& CString::operator = (const CString& str) { if(str.s==NULL) { return *this; } else { delete this; /*this->~CString();*/ int length=strlen(str.s)+1; this->s = new char[length]; //realloc(s,length); // s = (char*)realloc(s, length); // if (s==NULL) // { // cerr << "error!"; // } strcpy(this->s ,str.s); return *this; } } char& CString::operator [](int i) { if(i>=0 && (i<strlen(s))) return s[i]; } ostream& operator << (ostream& output,const CString& str) { output<<str.s; return output; } int main() { CString s1 ("HangZhou"),s2 ("+"),s3 ("ShangHai"); CString s4; s4 = s1+s2+s3; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4 << endl; s4 [8] = '&'; cout << s4 << endl; return 0; } 修改如下: #include<iostream> #include<string> using namespace std; class CString; ostream& operator << (ostream&output,const CString&); CString& operator + (CString &lhs, CString &rhs); class CString { friend ostream& operator << (ostream&,const CString&); friend CString& operator + (CString &lhs, CString &rhs); private: char *s; public: CString(); CString(const char *str); ~CString(); //CString&operator + (CString&str); CString&operator = (const CString&str); char&operator [](int i); }; CString::CString() { s = new char[1]; s = '/0'; } CString::CString(const char*str) //拷贝构造 { if(str==NULL) { s=new char[1]; s='/0'; } else { int longth=strlen(str); s=new char[longth+1]; strcpy(s,str); } } CString::~CString() { /* if(s!=NULL) { delete [] s; s = NULL; } */ } CString& operator +(CString &lhs, CString &rhs) { if (lhs.s == NULL) return rhs; if (rhs.s == NULL) return lhs; else { int length = strlen(lhs.s)+strlen(rhs.s)+1; CString Tempstr(lhs.s); delete []lhs.s; lhs.s = new char[length]; strcpy(lhs.s, Tempstr.s); strcat(lhs.s, rhs.s); return lhs; } } CString& CString::operator = (const CString& rhs) { if(this == &rhs) return *this; delete []s; int length=strlen(rhs.s)+1; s = new char[length]; strcpy(s, rhs.s); return *this; } char& CString::operator [](int i) { if(i>=0 && (i<strlen(s))) return s[i]; } ostream& operator << (ostream& output,const CString& str) { output<<str.s; return output; } int main() { CString s1 ("HangZhou"),s2 ("+"),s3 ("ShangHai"); CString s4; s4 = s1+s2+s3; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4 << endl; s4 [8] = '&'; cout << s4 << endl; return 0; }