• ベストアンサー

C++のクラスについて

C++を勉強しているC言語経験者です。 C++のクラスについてですが、クラスのメリットとはなんでしょうか?なんだか関数ポインタを持った構造体にしか見えないと言うか・・・(あと隠蔽化機能も持ってるんですね)。私が小規模なプログラムを組んだことしかない為か、クラスの必要性が全くわかりません。クラスは具体的にどう使い、どう役に立つものなのでしょうか? 回答よろしくお願いします。

noname#113783
noname#113783

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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個生成する ということもできます。

noname#113783
質問者

お礼

読んでいて感じたのですが、クラスは構造体よりもずっと抽象的ですね。そして属性と動作をまとめておけると便利そうです。 回答ありがとうございました!

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

>なんだか関数ポインタを持った構造体にしか見えないと言うか 早い話そういうことですね。 >私が小規模なプログラムを組んだことしかない為か、 そうですね。大規模なプログラムになると、関数の数だけで、数百個以上になります。 こうなると関数名をつけるだけで大変です。衝突しないようにと冗長な関数名にすると、プログラムの視認性がどんどん悪くなります。 クラスを使うと、そのあたりが非常にすっきり書けます。 Cで大規模なプログラムを書いて苦労したことがあると、C++のありがたさがわかります。

noname#113783
質問者

お礼

C++がどんな物かわかってきました。早く大規模なプログラムが書けるようになりたいですね。数百個の関数のあるプログラムなんて気が遠くなりますが・・・。 回答ありがとうございました!

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.1

クラスはできることは関数ポインタを持った構造体です。おっしゃるとおりです。 クラスを使うメリットはオブジェクト指向でプログラミングを行うことができるということだと思います。 オブジェクト指向はプログラマーに関数・変数の使用範囲・使用方法を限定させます。カプセル化ですね。つまりできないようにする・制限することがポイントだと思います。 これによって一貫性のあるプログラムができる。 オブジェクト指向(C++)だと、カプセル化によってまったく同じ処理(関数)でも使用用途が違うと他から使えなくなります。 Cだと、目的が違っても同じ処理なら同じ関数でどこからも使われるようになると思います。 オブジェクト指向(C++)だと、目的が違うなら同じ処理でも複数箇所で実装されるべきです。本当に共通な処理であれば、オブジェクトとして分離されるはず。 これは特にプログラムを開発・修正するときに大きな違いが出ると思います。 オブジェクト指向(C++)では開発・修正で気にするのはオブジェクトのインターフェースが変わるかどうか。変わらないなら影響範囲はクラス内のみ。明確です。変わるなら、そのクラスの使用する方法の変更が影響範囲。 逆にCだと、影響範囲は関数を使用している部分。場合によってはプログラム全域に及ぶことも。。範囲が明確でない。 概念的にはこんなとこだと思います。 この違いで、開発・修正作業の大変さが多くの場合でぜんぜん違ってくると思います。 このへんがメリットじゃないでしょうか。 デメリットは速度とか、処理順序が(たくさんジャンプするので)コードから直感的にわからないとか。

noname#113783
質問者

お礼

なんだか実感が沸きませんが、大規模なプログラムだと速度より開発のしやすさが大事なんですね。大規模なプログラムを作ろうと思う前にC++始めといて良かったです。 回答ありがとうございました!

関連するQ&A

  • C++のクラスについて

    シューティングゲームの製作の為、C++を勉強しているのですが、 C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 また、Cの構造体とC++のクラスの違いは何でしょうか。 クラスの中に関数を作る利点は何なのでしょうか。 質問が多くて申し訳ないのですが、ご教授の方よろしくお願いします。

  • C#で、Cのファイルポインタ(?)のような機能

    プログラムの初心者、かつ、C#の初心者です。  C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。  やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。  宜しくお願いいたします。

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • android-JNIでクラス配列参照方法について

    androidのJNIで関数引数をクラス配列にした場合、C側ではこのポインタをどのようにすれば取得出来るのでしょうか? 一応GetByteArrayElements()を使用してクラス配列の要素数までは取得できましたが、このクラスのポインタの取得方法が出来ません。 ※クラス配列にある変数をC言語側で参照したいと考えております。 (このクラスはC言語の構造体として扱うようにしています)

  • C言語でプログラムを作りたい

    現在、C言語を学習中でして、入出力・制御文・配列・演算子・ポインタ・自作関数・構造体・共用体・ファイル入出力くらいはなんとか使えるくらいになったと思うのですが、そこで、一つ自分でプログラムを作ってみたいと考えています。 しかしながら、これまで学習してきたことを駆使して作れるプログラムが思いつきません。 ですので、なにかいいお題があれば教えていただきたいです。 これまで学習してきたことをしっかりと定着させたいと考えています。 宜しくお願いします。

  • クラスの分割

    画像処理のプログラムを書いているのですが、1つのクラスに必要な変数と関数をぶち込んだため、変数20~、関数20~、2000行くらいのクラスになっています。 このままでは見辛いので、クラスを処理ごとに分割して見易くしたいのですが、各関数でいくつか共通の変数を使用しているため上手く分割ができなくて困っています。 データのみのクラスを継承した子クラスを3つ作ってみたらインスタンスが3つできてしまい意味がありませんでした。 ↓の図に示すようなクラスを作りたいのですが、いくつか質問をさせてください       共通データクラス     /    |    \   子クラスA 子クラスB 子クラスC 1、変数20~、関数20~、2000行くらいのクラスは普通でしょうか?(分割する必要がありますか?) 2、↑の図はクラスの作り方として問題がありますか? 3、2で問題がない場合実現する方法として、仮想継承、関数に共通データのポインタを渡す以外に方法があるかどうか まだまだC++を勉強中で、便利な構造体程度にしか使えていませんが、どなたかご教授お願いします。

  • C,C++,C++/CLIの構造体とクラス

    C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが privateかpublicかという違い「だけ」しか全くないのでしょうか? クラスにおける value class / ref class という分類はC++/CLIのもので これについては value class の方は C言語の構造体に近いという事でいいでしょうか? ref classの方は ネイティブのC++のクラスを マネージ用にしたようなもので C++/CLIの構造体は C++のそれと同じで OKですか? そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

  • C言語

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ まではやったんですが(参考書で勉強)。 その次になにを勉強したらよく分からないので、 何を勉強するべきか教えてください。 将来的にこれっと言った作りたいものは決めていません。 お願いします。

  • Cで関数とポインタと構造体の表現法

    C言語の関数で 構造体・共用体の入った配列を関数にポインタで送りたいと思うのですが上手くいきません プロトタイプ宣言とメイン文での表現・関数そのものでの表現 が詳しく知りたいのですがサイトまたは記述方を教えてください。 上記の条件で ポインタは*をつけるつけない 関数で引数はどうやって選ぶのか 構造体名などはどのように表現すればいいのか などの見分けがいまいちつかないので悩んでいます。

  • 入門より少し進んだC言語の勉強方法

    初めまして。 現在、C言語の勉強をしています。 C言語入門用の本を2~3冊読み、実際に自分で書いてみて関数やポインタ、構造体などの初歩的な事は理解しました。 また、基本情報技術者試験をC言語で受験し、合格する事が出来ました。 しかし、基本情報技術者試験に出てくるプログラミングの問題を読み、どのような動作をするのか追いかける事は出来ますが、似たようなレベルのプログラムを「自分で1から書けるか」と言われたら難しいと思います。 入門用の本を卒業し、次のステップに進みたいと思うのですが、どのように勉強すればいいのかよく分からず、止まってしまっている状態です。 ぜひ、今後におけるおすすめの勉強方法がありましたら教えてください。 宜しくお願いします。

専門家に質問してみよう