- ベストアンサー
C++のクラスについて
C++を勉強しているC言語経験者です。 C++のクラスについてですが、クラスのメリットとはなんでしょうか?なんだか関数ポインタを持った構造体にしか見えないと言うか・・・(あと隠蔽化機能も持ってるんですね)。私が小規模なプログラムを組んだことしかない為か、クラスの必要性が全くわかりません。クラスは具体的にどう使い、どう役に立つものなのでしょうか? 回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
クラスが、関数つきのポインタに見えるのは、 C++が、Cの構造を引きずっているために、 そう表現するのが手っ取り早かったというこ とにすぎません。 さて、オブジェクト指向的な意味での、クラ スは、例えば、「犬」という抽象的な概念を 具体的な、「ぽち」とか、「はち」という概 念に具象化する機能です。 さて、ここで、この機能が意味を持つのは、 犬が複数存在することが必要です。 世界に「ぽち」という犬しかいなかった場合、 ある性質が「犬」のものなのか、「ぽち」の ものなのか区別することはできません。 世界に、山ほどの犬がいるから、共通の性質 は「犬」の性質として抽象化できるわけです。 さて、こういう意味を持っているので、プロ グラムの中で、同じようなものが複数でてこ ないと、クラスのありがたみは、あまりあり ません。 例えばシューティングゲームで、敵が一台し かいない場合、 enemy_move(int x, int y); // 動くとか enemy_attack(int w); // パワー w で攻撃してくるとか enemy_blast(); // 爆発するとか そういう関数を定義すればいいわけです。 でも、敵が何台もいる場合、 enemy boss(is_boss); enemy soldier_a(is_soldier); enemy soldier_b(is_soldier); enemy soldier_c(is_soldier); と、ボスや、手下の属性で定義しておけば、 boss.move(10, 10); soldier_a.move(10, 10); としたときに、どちらも、「敵」なので、 敵としてふさわしい動きさせて、なおかつ、 boss はボスらしく、soldier_a は、手下 らしく動く(スピードが違うかもしれない) また、 boss.attack(10); と、 soldier_a.attack(10); は、 同じように攻撃してくるでしょうけれど、 威力が違ったり、武器が違ったりするかも しれません。 このように、取り扱う対象が複数になって くると、クラスのありがたみはとても大き くなります。 あと、上記では、説明のために、bossも soldier も、同じ enemy で定義していま すが、そもそも、敵だと言っても、ボスと 手下じゃ根本的に違うというのが普通なの で、その場合、「継承」というテクニック で、 enemy class から、boss class を派生させる enemy class から、soldier class を派生させる というのが普通です。 また、手下が 100人ぐらいいるという場合、 当然、手下クラスの配列を100個生成する ということもできます。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
>なんだか関数ポインタを持った構造体にしか見えないと言うか 早い話そういうことですね。 >私が小規模なプログラムを組んだことしかない為か、 そうですね。大規模なプログラムになると、関数の数だけで、数百個以上になります。 こうなると関数名をつけるだけで大変です。衝突しないようにと冗長な関数名にすると、プログラムの視認性がどんどん悪くなります。 クラスを使うと、そのあたりが非常にすっきり書けます。 Cで大規模なプログラムを書いて苦労したことがあると、C++のありがたさがわかります。
お礼
C++がどんな物かわかってきました。早く大規模なプログラムが書けるようになりたいですね。数百個の関数のあるプログラムなんて気が遠くなりますが・・・。 回答ありがとうございました!
- ssk38
- ベストアンサー率44% (22/49)
クラスはできることは関数ポインタを持った構造体です。おっしゃるとおりです。 クラスを使うメリットはオブジェクト指向でプログラミングを行うことができるということだと思います。 オブジェクト指向はプログラマーに関数・変数の使用範囲・使用方法を限定させます。カプセル化ですね。つまりできないようにする・制限することがポイントだと思います。 これによって一貫性のあるプログラムができる。 オブジェクト指向(C++)だと、カプセル化によってまったく同じ処理(関数)でも使用用途が違うと他から使えなくなります。 Cだと、目的が違っても同じ処理なら同じ関数でどこからも使われるようになると思います。 オブジェクト指向(C++)だと、目的が違うなら同じ処理でも複数箇所で実装されるべきです。本当に共通な処理であれば、オブジェクトとして分離されるはず。 これは特にプログラムを開発・修正するときに大きな違いが出ると思います。 オブジェクト指向(C++)では開発・修正で気にするのはオブジェクトのインターフェースが変わるかどうか。変わらないなら影響範囲はクラス内のみ。明確です。変わるなら、そのクラスの使用する方法の変更が影響範囲。 逆にCだと、影響範囲は関数を使用している部分。場合によってはプログラム全域に及ぶことも。。範囲が明確でない。 概念的にはこんなとこだと思います。 この違いで、開発・修正作業の大変さが多くの場合でぜんぜん違ってくると思います。 このへんがメリットじゃないでしょうか。 デメリットは速度とか、処理順序が(たくさんジャンプするので)コードから直感的にわからないとか。
お礼
なんだか実感が沸きませんが、大規模なプログラムだと速度より開発のしやすさが大事なんですね。大規模なプログラムを作ろうと思う前にC++始めといて良かったです。 回答ありがとうございました!
お礼
読んでいて感じたのですが、クラスは構造体よりもずっと抽象的ですね。そして属性と動作をまとめておけると便利そうです。 回答ありがとうございました!