一、头文件
# pragma once
# include <iostream>
class String
{
public : String ( ) ; String ( const char * pstr) ; String ( const String & str) ; ~ String ( ) ; String & operator = ( const String & str) ; String & operator = ( const char * pstr) ; String & operator += ( const String & str) ; String & operator += ( const char * pstr) ; char & operator [ ] ( std:: size_t index) ; const char & operator [ ] ( std:: size_t index) const ; std:: size_t size ( ) const ; const char * c_str ( ) const ; friend bool operator == ( const String & leftStr, const String & rightStr) ; friend bool operator != ( const String & leftStr, const String & rightStr) ; friend bool operator < ( const String & leftStr, const String & rightStr) ; friend bool operator > ( const String & leftStr, const String & rightStr) ; friend bool operator <= ( const String & leftStr, const String & rightStr) ; friend bool operator >= ( const String & leftStr, const String & rightStr) ; friend std:: ostream & operator << ( std:: ostream & os, const String & str) ; friend std:: istream & operator >> ( std:: istream & is, String & str) ; private : char * _pstr;
} ; String operator + ( const String & thisStr, const String & otherStr) ;
String operator + ( const String & thisStr, const char * otherpStr) ;
String operator + ( const char * thisPstr, const String & otherStr) ;
二、String实现
# include <cstring>
# include "08_MyString.hh" using namespace std;
String :: String ( )
: _pstr ( new char [ 1 ] { 0 } )
{ strcpy ( _pstr, "" ) ;
}
String :: String ( const char * pstr)
: _pstr ( new char [ strlen ( pstr) + 1 ] { 0 } )
{ strcpy ( _pstr, pstr) ;
}
String :: String ( const String & str)
: _pstr ( new char [ strlen ( str. _pstr) + 1 ] { 0 } )
{ strcpy ( _pstr, str. _pstr) ;
}
String :: ~ String ( ) { delete [ ] _pstr;
}
String & String:: operator = ( const String & str) { if ( this != & str) { delete [ ] _pstr; _pstr = new char [ strlen ( str. _pstr) + 1 ] { 0 } ; strcpy ( _pstr, str. _pstr) ; } return * this ;
}
String & String:: operator = ( const char * pstr) { delete [ ] _pstr; _pstr = new char [ strlen ( pstr) + 1 ] { 0 } ; strcpy ( _pstr, pstr) ; return * this ;
}
String & String:: operator += ( const String & str) { size_t newLen = strlen ( _pstr) + strlen ( str. _pstr) + 1 ; char * newStr = new char [ newLen] { 0 } ; strcat ( newStr, _pstr) ; strcat ( newStr, str. _pstr) ; delete [ ] _pstr; _pstr = newStr; return * this ;
}
String & String:: operator += ( const char * pstr) { size_t newLen = strlen ( _pstr) + strlen ( pstr) + 1 ; char * newStr = new char [ newLen] { 0 } ; strcat ( newStr, _pstr) ; strcat ( newStr, pstr) ; delete [ ] _pstr; _pstr = newStr; return * this ;
}
char & String:: operator [ ] ( size_t index) { if ( index < strlen ( _pstr) ) { return _pstr[ index] ; } else { static char nullchar = '\0' ; return nullchar; }
}
const char & String:: operator [ ] ( size_t index) const { if ( index < strlen ( _pstr) ) { return _pstr[ index] ; } else { static char nullchar = '\0' ; return nullchar; }
}
size_t String :: size ( ) const { return strlen ( _pstr) ;
}
const char * String :: c_str ( ) const { return _pstr;
}
bool operator == ( const String & leftStr, const String & rightStr) { return strcmp ( leftStr. _pstr, rightStr. _pstr) == 0 ? true : false ;
}
bool operator != ( const String & leftStr, const String & rightStr) { return strcmp ( leftStr. _pstr, rightStr. _pstr) != 0 ? true : false ;
}
bool operator < ( const String & leftStr, const String & rightStr) { return strcmp ( leftStr. _pstr, rightStr. _pstr) < 0 ? true : false ;
}
bool operator > ( const String & leftStr, const String & rightStr) { return strcmp ( leftStr. _pstr, rightStr. _pstr) > 0 ? true : false ;
}
bool operator <= ( const String & leftStr, const String & rightStr) { int res = strcmp ( leftStr. _pstr, rightStr. _pstr) ; return res > 0 ? false : true ;
}
bool operator >= ( const String & leftStr, const String & rightStr) { int res = strcmp ( leftStr. _pstr, rightStr. _pstr) ; return res < 0 ? false : true ;
}
ostream & operator << ( ostream & os, const String & str) { os << str. _pstr; return os;
}
istream & operator >> ( istream & is, String & str) { char buf[ 4096 ] ; is. getline ( buf, sizeof ( buf) ) ; delete [ ] str. _pstr; str. _pstr = new char [ strlen ( buf) + 1 ] ; strcpy ( str. _pstr, buf) ; return is;
}
String operator + ( const String & thisStr, const String & otherStr) { String temp ( thisStr. c_str ( ) ) ; temp+= otherStr. c_str ( ) ; return temp;
}
String operator + ( const String & thisStr, const char * otherPstr) { String temp ( thisStr. c_str ( ) ) ; temp+= otherPstr; return temp;
}
String operator + ( const char * thisPstr, const String & otherStr) { String temp ( thisPstr) ; temp+= otherStr. c_str ( ) ; return temp;
}