GoF本のためのC++入門 (その2)
前回に引き続き、GoF本に載っているサンプルコードを読むためにC++を勉強してみる。GoF本ってのはオブジェクト指向における再利用のためのデザインパターンのことね。
今回はクラスの定義をやってみる。デザインパターンではクラスを多用する(というか、ほとんど全部クラス)なので大事だ。参考にしたページは以下。
まずは新しいクラスの例として複素数クラスを定義する。
#include <cmath> // 複素数クラスの宣言 class Complex { public: // ここはpublic Complex(double real, double imaginary); // コンストラクタ ~Complex(); // デストラクタ // メンバ関数(メソッド) double absolute(); private: // ここからはprivate double re; // 実部 double im; // 虚部 }; // メンバ関数の実装 Complex::Complex(double real, double imaginary) { re = real; im = imaginary; } Complex::~Complex() {} double Complex::absolute() { return sqrt(re * re + im * im); }
ポイントは以下。
- 最初の
class Complex { /* ... */ }
という所で新しくクラスを宣言している。ここではメンバ変数/関数の宣言をする。 - クラス宣言の中に
public:
,private:
とか書いてパブリック、プライベートなフィールドを分ける。 クラス名::メンバ関数名
という形式でメンバ関数を実装する。- クラス名と同じ名前のメソッドがコンストラクタになる。
- クラス名の頭に
~
を付けたメソッドがデストラクタになる。
実際にこのクラスを使ってみる。
#include <iostream> #include <cmath> using namespace std; class Complex { // 上と一緒 }; // メソッドの実装 // 上と一緒 // ここからが本番 int main() { Complex z1 = Complex(3, 4); cout << "|z1| = " << z1.absolute() << endl; //=> |z1| = 5 // new演算子を使ってインスタンス化する Complex* z2 = new Complex(5, 12); cout << "|z2| = " << z2->absolute() << endl; //=> |z2| = 13 delete z2; return 0; }
普通(?)にComplex の変数として宣言する方法と、new演算子を使う方法があるみたい。newの方はComplex型変数のポインタみたいな感じで使うようだ。なのでアロー演算子(->)でメンバ関数を呼び出すし、使い終わったらdeleteで解放しないといけない(めんどくさいぜ)。まあ、GoF本のサンプルではnewばっかり使っているので、この方法に慣れておく。