質問: クラスの利点について 手続き志向プログラミングになれてしまって困っています。クラスは関数、構造体とはどう違うのですか。参考書に載っている<クラスを使った例題>を、<関数&構造体>に置き換えたほうが短くなりますし、見やすく感じてしまいます。クラスの良さというものが分かりません。固くなった私の頭を納得させるような説明やその例題(実用的なもの)をお願いします。
回答: はっきり言って、入門書の例題が悪いだけと言わざるを得ません。 たぶん c -> c++ だと思うので、c++ の stl を一例に挙げてみます。 配列の変わりに vector という(テンプレート)クラスがあります。配列の長さが実行時に動的に変化する場合、従来の関数&構造体では、メモリの管理に手間を取られていました。 しかし、vector クラスを使えば、サイズ変更は resize() の一行ですみ、また、解放も vector クラスが自動的に行ってくれるので、利用者は心配する必要がありません。 この様に、設計者と利用者が違う場合でもスムーズに、手間が少なく利用出来ます。 配列の大きさが欲しくなれば size() で得ることが出来ますし、それようの(何処で書き換えられるか分かったもんじゃない)グローバル変数を用意する必要はなくなります。 ソートしたくなれば、vector を使っていようが、list を使っていようが同じ sort 関数を用いればソートが出来てしまいます。 char* ではいちいち、どのくらい確保したから...というのを気にしてプログラムしなければいけませんが、stringを用いればそのような苦労も減ります。 また、シューティングゲームを作ることを考えます。 敵キャラを管理する必要がありますが、このとき、構造体&関数を使って、敵キャラそれぞれに独自の動きをつけようとすると、なかなかすっきりしたプログラムを作ることは出来ません。 しかし、cenemybase という基底クラスから敵キャラのクラスを派生させるような設計にすれば、管理は cenemybase のポインタ配列を持てば良いことになり、実装もすっきりしたものになります。 基底クラスにある描画する関数などは、派生クラスで独自のものにオーバーライド出来るので、わかりやすさを保ったまま細かく制御することが出来ます。 また、メンバ変数に直接アクセス出来ないようにするカプセル化も大きく力を発揮します。変数に代入する際、値のチェックなどを「確実に」するようにすると物凄い行数が必要となってしまいます。しかし、メンバ関数を通じてアクセスするようにすれば、安全なアクセスにすることができます。 また、ちょっと変更したいなと言うときのつぎはぎ的な作業もクラス化しておいた方が楽です。 そして、クラス単位に設計を分けることで複数人での分散作業もしやすくなります。 後、例えば、fwrite や fread の様にいちいちサイズを指定する必要がある関数よりも、クラスで型毎に動作が分かれている方が見やすいプログラムになりませんか? そういった、面倒な部分を隠してしまうと言うのがとりあえず、わかりやすいメリットでは無いかと思います。 他にもメリットはたくさんあります。 もちろん、小規模のプログラムでも無理に使う必要はありませんが、大抵うまくクラスを使った方が見やすいです^^;