コンストラクタやメソッドの書き方
前回のプログラムを、もう少しC++のオブジェクト指向っぽい書き方を導入してみる。この際に、分かりやすく記述するため、行数が長くなってきた時のための処理を考慮して、記述してみる。
#include <stdio.h> #include <math.h> class Complex { private: double re ; double im ; public: // 絶対座標系でも極座標系でも、実部・虚部・絶対値・偏角を扱うため inline double get_re() const { return re ; } inline double get_im() const { return im ; } inline double get_r() const { return sqrt( re*re + im*im ) ; } inline double get_th() const { return atan2( im , re ) ; } // 極座標系なら、以下のような getterメソッド を書いておけば、 // 座標系を気にせず処理がかける。 // inline double get_re() const { return r * cos( th ) ; } // inline double get_r() const { return r ; } // inline は、開いたサブルーチンで実装してくれるので処理速度が遅くならない // foo() const { ... } は、オブジェクトに副作用が無いことを示す。 // コンストラクタのメンバー変数の初期化の書き方 // Complex( ... ) // : 要素1( 値1 ) , 要素2( 値2 ) ... // { その他の初期化 // } Complex() // コンストラクタ : re( 0.0 ) , im( 0.0 ) {} Complex( double r , double i ) // コンストラクタ : re( r ) , im( i ) {} // メソッドのプロトタイプ宣言 // メソッドの中身が長くなる場合は、 // 名前と引数だけを宣言しておく void print() ; void add( Complex ) ; void mul( Complex ) ; } ; // ←しつこいけどセミコロン忘れないでね。 // クラス宣言の外にメソッドの定義を書く // メソッドの中身の記述 「::」をクラス限定子と呼ぶ void Complex::print() { printf( "%lf + j%lf¥n" , get_re() , get_im() ) ; } void Complex::add( Complex z ) { re = re + z.re ; im = im + z.im ; } void Complex::mul( Complex z ) { double r = re * z.re - im * z.im ; double i = re * z.im + im * z.re ; re = r ; im = i ; } int main() { Complex a( 1.0 , 2.0 ) ; Complex b( 2.0 , 4.0 ) ; a.add( b ) ; a.print() ; return 0 ; }
参考資料
レポート1(複素数の加減乗除)
授業中に示した上記のプログラムをベースに、 記載されていない減算・除算のプログラムを作成し、レポートを作成する。 レポートには、下記のものを記載すること。
- プログラムリスト
- プログラムへの説明
- 動作確認の結果
- プログラムより理解できること。
実際にプログラムを書いてみて分かった問題点など…
[…] 複素数とクラス・隠蔽化の演習 […]