这是最基本的String的实现
/* * The basic implementation of String */ #include <iostream> #include <cstring> #include <iomanip> using std::istream; using std::ostream; using std::cout; using std::endl; using std::cin; using std::setw; class String{ public: friend istream& operator>>(istream&,String&); friend ostream& operator<<(ostream&, const String&); friend String operator+( const String&, const String&); friend String operator+( const String&, const char*); public: String():_string( 0),_size( 0){} String( int, char); String( const char*); String( const String&); ~String(){delete[] _string;} String& operator=( const String&); String& operator=( const char*); String& operator+=( const String&); String& operator+=( const char*); String& operator+=( const char&); bool operator==( const String &) const; bool operator!=( const String &) const; bool operator>( const String &) const; bool operator>=( const String &) const; bool operator<( const String &) const; bool operator<=( const String &) const; bool operator==( const char*) const; bool operator!=( const char*) const; bool operator>( const char*) const; bool operator>=( const char*) const; bool operator<( const char*) const; bool operator<=( const char*) const; char operator[]( int) const; // int size(){ return _size;} private: char* _string; int _size; }; istream& operator>>(istream& is,String& str){ const int limit_string_size= 4096; char inBuf[limit_string_size]; is>>setw(limit_string_size)>>inBuf; str=inBuf; return is; } ostream& operator<<(ostream& os, const String& str){ os<<str._string; return os; } String::String( int n, char ch) { _string= new char[n+ 1]; for( int i= 0;i<n;i++) _string[i]=ch; _string[n]= ' \0 '; _size=n; } String::String( const char* str) { if(!str){ _size= 0; _string=NULL; } else{ _size=strlen(str); _string= new char[_size+ 1]; strcpy(_string,str); } } String::String( const String& str) { _size=str._size; if(!str._string) _string= 0; else{ _string= new char[_size+ 1]; strcpy(_string,str._string); } } String& String:: operator=( const String& str) { if( this!=&str){ if(_size==str._size){ strcpy(_string,str._string); } else{ _size=str._size; delete[] _string; if(!str._string) _string=NULL; else{ _string= new char[_size+ 1]; strcpy(_string,str._string); } } } return * this; } String& String:: operator=( const char*str) { if(!str){ _size= 0; if(_string) delete[] _string; _string=NULL; } else{ _size=strlen(str); delete[] _string; _string= new char[_size+ 1]; strcpy(_string,str); } return * this; } String& String:: operator+=( const String& str) { if(str._size== 0) return * this; _size+=str._size; char* buf= new char[_size+ 1]; strcpy(buf,_string); delete[] _string; strcat(buf,str._string); _string=buf; return * this; } String& String:: operator+=( const char* str) { if(!str) return * this; size_t len=strlen(str); _size+=len; char* buf= new char[_size+ 1]; strcpy(buf,_string); delete[] _string; strcat(buf,str); _string=buf; return * this; } String& String:: operator+=( const char& c) { _size+= 1; char* buf= new char[_size+ 1]; strcpy(buf,_string); delete[] _string; buf[_size- 1]=c; _string=buf; return * this; } bool String:: operator==( const String& str) const { if(_size!=str._size) return false; else return strcmp(_string,str._string)== 0? true: false; } bool String:: operator!=( const String& str) const{ return !(* this==str); } bool String:: operator>( const String& str) const{ return strcmp(_string,str._string)> 0; } bool String:: operator>=( const String& str) const{ return strcmp(_string,str._string)>= 0; } bool String:: operator<( const String& str) const{ return strcmp(_string,str._string)< 0; } bool String:: operator<=( const String& str) const{ return strcmp(_string,str._string)<= 0; } bool String:: operator==( const char* str) const { return strcmp(_string,str)== 0? true: false; } bool String:: operator!=( const char* str) const { return strcmp(_string,str)!= 0? true: false; } bool String:: operator>( const char* str) const { return strcmp(_string,str)> 0? true: false; } bool String:: operator>=( const char* str) const { return strcmp(_string,str)>= 0? true: false; } bool String:: operator<( const char* str) const { return strcmp(_string,str)< 0? true: false; } bool String:: operator<=( const char* str) const { return strcmp(_string,str)<= 0? true: false; } char String:: operator[]( int n) const { if(n>= 0&&n<_size) return _string[n]; else return - 1; } String operator+( const String&str1, const String& str2) { String newstr; if(str1._size== 0&&str2._size== 0) return newstr; else if(str1._size== 0&&str2._size!= 0){ newstr=str2; } else if(str1._size!= 0&&str2._size== 0){ newstr=str1; } else{ newstr._size=str1._size+str2._size; newstr._string= new char[newstr._size+ 1]; strcpy(newstr._string,str1._string); strcat(newstr._string,str2._string); } return newstr; } String operator+( const String&str1, const char*str2) { String newstr; size_t len=strlen(str2); if(str1._size== 0&&len== 0) return newstr; else if(str1._size== 0&&len!= 0){ newstr=str2; } else if(str1._size!= 0&&len== 0){ newstr=str1; } else{ newstr._size=str1._size+len; newstr._string= new char[newstr._size+ 1]; strcpy(newstr._string,str1._string); strcat(newstr._string,str2); } return newstr; } int main() { int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0; // 为了使用 operator==( const char* ) // 我们并不定义 The( "The" )和 It( "It" ) String buf, the( " the " ), it( " it " ); // 调用 operator>>( istream&, String& ) while ( cin >> buf ) { ++wdCnt; // 调用 operator<<( ostream&, const String& ) cout << buf << ' '; if ( wdCnt % 12 == 0 ) cout << endl; // 调用 String::operator==(const String&) and // if ( buf == the || buf == " The " ) ++theCnt; if ( buf == it || buf == " It " ) ++itCnt; // 调用 String::size() for ( int ix = 0; ix < buf.size(); ++ix ) { // 调用 String::operator[](int) switch( buf[ ix ] ) { case ' a ': case ' A ': ++aCnt; break; case ' e ': case ' E ': ++eCnt; break; case ' i ': case ' I ': ++iCnt; break; case ' o ': case ' O ': ++oCnt; break; case ' u ': case ' U ': ++uCnt; break; default: ++notVowel; break; } } } // 调用 operator<<( ostream&, const String& ) cout << " \n\n " << " Words read: " << wdCnt << " \n\n " << " the/The: " << theCnt << ' \n ' << " it/It: " << itCnt << " \n\n " << " non-vowels read: " << notVowel << " \n\n " << " a: " << aCnt << ' \n ' << " e: " << eCnt << ' \n ' << " i: " << iCnt << ' \n ' << " o: " << oCnt << ' \n ' << " u: " << uCnt << endl; String a= " hello "; String b= " world "; String c=a+b; cout<<c<<endl; return 0; }