// ( r15.C ) // 演算子のオ−バロ−ドの注意:文字列操作の例 // #include #include class String { int len ; char* str ; public: String( char* p = "" ) { len = strlen( p ) ; str = new char[len+1] ; strcpy( str,p ) ; } void put() { cout << len << " : " << str << "\n" ; } friend String operator+( String&,String& ) ; String& operator*( String& ) ; } ; String operator+( String& p1,String& p2 ) // フレンド関数の方 { String temp ; temp.len = p1.len + p2.len ; char* t = new char[temp.len+1] ; strcpy( t,p1.str ) ; strcat( t,p2.str ) ; strcpy( temp.str,t ) ; delete [temp.len+1]t ; return( temp ); } String& String::operator*( String& p ) // メンバ関数の方 { len = len + p.len ; // operator* にしてあるが、意味は + である。 char* t = new char[len+1] ; strcpy( t,str ) ; strcat( t,p.str ) ; delete str ; str = t ; return *this ; } main() { String p1( "KATOU" ) ; String p2( "yasuda" ) ; String p3 ; p3 = p1 + p2 ; // 注目:フレンド関数の方 p3.put() ; p1.put() ; p2.put() ; cout << "\n" ; String s1( "KATOU" ) ; String s2( "yasuda" ) ; String s3 ; s3 = s1 * s2 ; // 注目:メンバ関数の方 s3.put() ; s1.put() ; s2.put() ; // s3 = s1 * "aaaaa" ; これはOK、こっちはNG s3 = "AAAA" * "aaaaa" } /* [結果] 11 : KATOUyasuda 5 : KATOU s1 の文字列は変わらない 6 : yasuda 11 : KATOUyasuda 11 : KATOUyasuda 変わってしまっている 6 : yasuda */