// ( r16.C ) // 演算子のオ−バロ−ドの注意:ベクトル計算の例 // #include class vector { int x,y ; public: vector( int Ix=0,int Iy=0 ) { x = Ix;y=Iy; } getx() { return x ; } gety() { return y ; } vector& operator+( vector& v ) ; vector& operator-( vector& v ) ; friend vector operator*( vector& v1,vector& v2 ) ; } ; vector& vector::operator+( vector& v ) { x = x + v.x ; // 自分自身に新しいものを足すということになる y = y + v.y ; return *this ; } vector& vector::operator-( vector& v ) { x = x - v.x ; y = y - v.y ; // 定義の vector& ... と return *this ; // return *this はペアとして覚える } vector operator*( vector& v1,vector& v2 ) { // * だけど足し算をやる vector temp ; temp.x = v1.x + v2.x ; temp.y = v1.y + v2.y ; return( temp ) ; // return temp でもよい } main() { vector v3,s3 ; vector v1( 10,10 ) ; vector v2( 20,20 ) ; v3 = v1 + v2 ; cout << v3.getx() << " " << v3.gety() << "\n" ; cout << v1.getx() << " " << v1.gety() << "\n" ; cout << v2.getx() << " " << v2.gety() << "\n\n" ; vector s1( 10,10 ) ; vector s2( 20,20 ) ; s3 = s1 * s2 ; cout << s3.getx() << " " << s3.gety() << "\n" ; cout << s1.getx() << " " << s1.gety() << "\n" ; cout << s2.getx() << " " << s2.gety() << "\n" ; } /* [結果] 30 30 30 30 v1 の値まで変わってしまっている。演算子のオ−バロ−ドは 20 20 よく分かっているものだけを使うようにした方が無難である。 30 30 10 10 フレンド関数の方は、v1 の値は変わらない 20 20 [参考] 演算子のオ−バロ−ドの定義は、フレンド関数を使った方が分かり易く間違いも少ない。 */