(79)コンストラクタと複素数クラス2019年4月25日コンストラクタプログラミングでは、データの初期化忘れによる間違いもよく発生する。クラスでは、コンストラクタ(構築子)がある。データ構造の初期化専用の関数。コンストラクタと反対に、デストラクタは、データが不要となった時に自動的に呼び出される関数。このクラスの中には、引数無しのコンストラクタと、引数ありのコンストラクタが出てくる。C++では、同じ名前の関数でも引数の数や型に応じて呼出す関数を適切に選んでくれる。呼出すように使うことが多いだろう。呼出すというのが定番の使い方だろう。隠蔽化と基本的なオブジェクト指向の練習課題として、複素数クラスをあげる。ここでは、複素数の加算・乗算を例に説明をするので、減算・除算などの処理を記述することで、クラスの扱いに慣れてもらう。クラスは、加減算の関数は単純だけど、乗除算の関数を書く時には面倒になってくる。この場合、極座標系でプログラムを書いたほうが判りやすいかもしれない。反対に、加算は面倒な処理になってしまう。←しつこく繰り返すけど、セミコロン忘れないでね(^_^;このように、プログラムを開発していると、当初は直交座標系でプログラムを記述していたが、途中で極座標系の方がプログラムが書きやすいという局面となるかもしれない。オブジェクト指向による隠蔽化を正しく行っていれば、利用者に影響なく「データ構造」や「その手続き(メソッド)」を書換えることも可能となる。このように、プログラムをさらに良いものとなるべく書換えることは、オブジェクト指向ではリファクタリングと呼ぶ。クラスを作っていれば、クラス利用者への影響が最小にしながらリファクタリングが可能となる。中に、要素の定義や、メソッドの記述を行うと説明してきたが、メソッド内の処理が長い場合もある。中に書こうとすると、全体像が見渡せない。いう時には、以下のように、メソッドのプロトタイプ宣言と、メソッドの実体の記述を別に記載する。いうメソッドを記載した。指定をせずに、リファクタリングしやすいクラスにすることができる。してしまうと、クラス外でオブジェクトへの代入が可能となる。機能の代用し、隠蔽化を徹底させることも多い。作るとプログラムの意味が分かりやすくなる。いったクラスの参照や代入のメソッドは、getter(ゲッター),setter(セッター)と呼ぶ。ゲッターやセッターメソッドでは、要素を参照(あるいは代入)するだけといった極めて単純な関数を作ることになる。この場合、関数呼び出しの処理時間が無駄になる。指定すると、コンパイラは関数呼び出し用の命令を生成せず、それと同じ処理となる命令を埋め込んでくれる。定数を書き換えることはできない。メソッドは要素を参照するだけで、オブジェクトの中身が変化しない。メソッド内にはオブジェクトに副作用のある処理を書いてはいけない。いった用途に、オブジェクトを変化させないメソッド宣言がある。