- ベストアンサー
構造体とクラスの違い
お世話になります。 先日、C(C++もかな?)のベテランのプログラマの方が「構造体とクラスはまったく違うものだ」ときっぱり言い切っていらっしゃいました。私は、構造体にメソッドが加わったものがクラスだ、くらいな認識で、まったく違うものというよりはかなり近しい概念だと思っていたので少々驚いた次第です。 疑問が残りましたので、インターネットでいろいろ検索してみたのですが、おしなべて「構造体とクラスには共通点が多い」と説明されており、どうしても「まったく違うもの」と解釈できる文献を見つけることができませんでした。 果たして「構造体とクラスはまったく違うもの」なのでしょうか?
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
> オブジェクト指向で大切なのは、プログラム(システム)全体での、各個のクラス > の役割(機能)と相互機能関係を堅牢に設計すること > というように解釈してよいでしょうか。また、そういう意味でUMLによる開発が有効 >なのでしょうか。 よく勉強なさっていらっしゃいますね。基本的には、ユーザをよく理解し、正しい文章を起草することが大切ということではないでしょうか。意味不明の文章(仕様書)を書く人が多いと思います。ただし、C++を設計したBjarne Stroustrup氏は、自分はプログラマである、とはっきり立場を表明されているようです(分析と設計、あるいは、度重なる打ち合わせだけではプログラムは完成しません)。 > 自分はJavaからプログラムに入った人間なのですが、 この意味がよく分かりません。 > 逆にJavaはオブジェクト指向を強制する言語ということになるでしょうか。 Stroustrup氏は、SmallTalkやJavaをこのように見ている節があります。 なお、同氏は、Javaは開発者だけではなく、マネージャなどの支持を取り付けようとした、という認識を示しているようです。 > ここでいう「型」の安全性とは、「その型のメンバへの不正アクセス発生の可 > 能性の有無」みたいなことでしょうか。 「型」の安全性を保障するには、ある時点で「型」、および、「型」と「型」の間の関係をチェックする必要があります。このチェックは実行時ではなく、コンパイル時に行うのが理想です。Stroustrup氏は、このような方針を打ち出しました。ちなみに、Cも先行するBなどより「型」を重視する言語です。どのような型がどのようにチェックされるのかを知りたい場合、恐れ入りますが、OSSなどの、たとえば、SQLiteなどを無料のVC++ Express Edition(VCEE)などでビルドしてみてください。VCEEはC++標準仕様を忠実に実装しようとしています。あるソースコードをビルドすると200を越える警告が出されます(そのように型チェックが行われる)。 > これもC++においてということでよろしいでしょうか > (Javaで設計されたクラスはすべてObjectクラスの子クラスだと思うので) テンプレートやジェネリック、という概念を後日調査してください。C++の考え方は、JavaやC#などに浸透しています(Stroustrup氏はこの自体をすでに予言していました)。 参考になれば幸いです。
その他の回答 (14)
- moritan2
- ベストアンサー率25% (168/670)
その、ベテランプログラマの方にはなんらかの宗教的な信念がおありでそのようなことを言っておられると思います。 基本的に class と struct は private か public かの状態が class ではディフォルトが private、struct では public になっているというだけしか違いはありません。メンバーを宣言するときに必ず public とか private からはじめるようにすれば class と struct は入れ替え可能です。 とはいえ、私自身 struct を使うのは c 文法でしか使わないものにしか使いません。struct でメンバ関数とか継承を使うのは、かなり「変わった書き方」という印象を与えますから。しかし、文法的には問題ないと思います。 ですからといって「まったく違うものだ」というのは、宗教的な信念であるとしか思えません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
著者へC++言語を作った人→著者の一人はC++言語の設計者
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
The Annotated Reference Manual 「注解C++リファレンスマニュアル」(初版) によると 構造体,デフォルトのアクセス制限の存在しないクラス とありますので、(著者へC++言語を作った人) C++においては、 構造体は、クラスの特別な形のもの という認識でいいと思います。
- 0KG00
- ベストアンサー率36% (334/913)
クラスの概念を実装するのに構造体を利用した、というのだと思います。構造体+メソッドとして関数などを追加していますよね。実際、クラスの概念には他に継承や多態性などもありますので、構造体とクラスがかならずしも共通点が多いという事ではないです。 まあ、構造体をクラスであらわす事ができるのでそういう考え方もありますが、オブジェクト指向としてクラスという概念を考えると違う点もあります。また、プログラム的に考えたとしても参照渡しか値渡しかという違いもありますね。
お礼
ありがとうございました。Cにおける構造体はabstract宣言できないんですよね。そういう点でクラスと構造体は違うなあということはよく理解できます。
- 1
- 2
お礼
ありがとうございます。クラスとは、構造体の構成要素(メンバ)及び構造体自身に可視性を定義できることにより、オブジェクトとしての(型としての?)安全性を高めた構造体とも言えるということでしょうかね。