コンストラクタやメソッドの書き方
前回のプログラムを、もう少し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(複素数の加減乗除)
授業中に示した上記のプログラムをベースに、 記載されていない減算・除算のプログラムを作成し、レポートを作成する。 レポートには、下記のものを記載すること。
- プログラムリスト
- プログラムへの説明
- 動作確認の結果
- プログラムより理解できること。
実際にプログラムを書いてみて分かった問題点など…
[…] 複素数とクラス・隠蔽化の演習 […]