C++の演算子のオーバーロード

今日のオブジェクト指向プログラミングの授業では、複素数を例題として、 オブジェクト指向のデータ隠蔽化・手続き隠蔽化といった話をする予定。 ついでに、お薦めはしないけど...演算子オーバーロードっちゅーのもあるよということで、 以下のコードも紹介しよう。

#include <stdio.h>

class Complex {
private:
  double re , im ;
public:
  // 基本コンストラクタ
  Complex( double r , double i )
    : re( r ) , im( i ) {}
  // 表示メソッド
  void print() {
    printf( "(%lf + j%lf)" , re , im ) ;
  }
  // フレンド関数(Complexのメソッドではないけど、re,imに触れる)
  friend Complex operator+( const Complex& a ,
                            const Complex& b ) {
    return Complex( a.re + b.re , a.im + b.im ) ;
  }
  friend Complex operator*( const Complex& a ,
                            const Complex& b ) {
    double r = a.re * b.re - a.im * b.im ;
    double i = a.re * b.im + a.im * b.re ;
    return Complex( r , i ) ;
  }
} ;

int main() {
  Complex a( 1 , 2 ) ;
  Complex b( 3 , 4 ) ;

  // 普通の変数の様に複素数の計算が書ける。
  Complex c = a + b * Complex( 2 , 0 ) ;
  c.print() ;
  return 0 ;
}

演算子のオーバーロードは、入出力にも使われていて、

#include <iostream>
using namespace std ;
int main() {
  cout << "Hello" << endl ;
}
class Complex {
  :
  friend ostream& operator<<( ostream& os,const Complex& z ) {
    return os << "(" << z.re << " + j" << z.im << ")" ;
  }
}
int main() {
  :
  cout << c << endl ;
  cout << ( Complex( 1 , 2 ) + Complex( 2 , 1 ) ) << endl ;
}
 

2017年5月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

アーカイブ

Google

このブログ記事について

このページは、T-Saitohが2017年5月12日 08:33に書いたブログ記事です。

ひとつ前のブログ記事は「緊急連絡システムがSpamhausのPBL」です。

次のブログ記事は「機械学習入門の講演会参加」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。