astruct
を使用すると、a のすべての機能を実現できますclass
: コンストラクタ (変更/オーバーロードできる)、デストラクタ (変更/オーバーロードできる)、演算子のオーバーロード、インスタンス メソッド、静的メソッド、 //public
フィールド/メソッドprivate
。protected
なぜ必要なclass
のですか?
struct
注: では、フィールド/メソッドがpublic
デフォルトであるという答えは望んでいません。
クラスは必要ありません。言語は、選択する別のオプションを提供するだけです。技術的には、その通りです。 でできることは何でも達成class
できますstruct
。
デフォルトのアクセス レベルに加えて、ほとんどのプログラマーがこの 2 つに関連付ける意味もあります。struct
一般的には、機能がほとんどまたはまったくない軽量のPOD
データ型を意味します。Aclass
は通常、より大きなものに関連付けられています。
Tal Pressman がWhen should you use a class vs a struct in C++? で答えたように。:
C++ FAQ から:
構造体のメンバーと基本クラスは既定でパブリックですが、クラスでは既定でプライベートになります。注: デフォルトに依存するのではなく、基底クラスを明示的に public、private、または protected にする必要があります。
それ以外の場合、構造体とクラスは機能的に同等です。
OK、きしむようなクリーンなテクノトークはもう十分だ。感情的には、ほとんどの開発者はクラスと構造体を明確に区別しています。構造体は、カプセル化や機能がほとんどないビットの開いた山のように単純に感じられます。クラスは、インテリジェントなサービス、強力なカプセル化の障壁、および明確に定義されたインターフェイスを備えた、社会の生きた責任あるメンバーのように感じられます。これはほとんどの人がすでに持っている意味合いであるため、メソッドがほとんどなく公開データを持つクラスがある場合は、おそらく struct キーワードを使用する必要があります (そのようなものは、適切に設計されたシステムに存在します!)。それ以外の場合は、おそらくクラスを使用する必要がありますキーワード。
http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.8
この理由に加えて、C には既に構造体があったことも考えられると思います。Bjarne Stroustrup が C++ を設計したとき、彼は、元の質問に記載されているすべての機能、つまり C には存在しなかった機能を備えたクラスを追加したいと考えていました。これらの機能を実装するとき、彼はおそらく、構造体とクラス (public/private のデフォルトの可視性を除く)。
TL/DR: C++ 構造体/クラスでは、POD またはより複雑な抽象化を持つプログラマーの意図が記述されており、class キーワードの導入はおそらく歴史的な理由からここにある (機能フルなクラスを作成するために追加のキーワードを追加してから、バックポートする)これらの機能を struct キーワードに追加するのは、実装がより実用的であるためです)。
class
オブジェクトのインスタンス化に使用される型の OO で一般的に受け入れられている名前です。C++ で OO パラダイムを導入するときclass
、struct
.
struct
C との下位互換性を最大化するために保持されていました。
今日の 2 つの使用法はこれに沿っています。struct
は C スタイルの POD 型に最も一般的に使用されclass
、 はクラスの OO 概念に使用されます。
簡単に言うと、class
まったく必要ありませんでした。デフォルトを、間違いなくより安全で OO プログラミングにより適したものに変更しますが、struct
現在 a を使用している任意の場所に (C++ で定義されているように) a を使用することができますclass
(かわいくてメタなものにしたい場合は、LSP を満たす のstruct
基本クラスを呼び出します)。class
同時に、struct
C++ での の誤解が横行しておりclass
、意図した概念に十分に適合しているため、多くの場合、説明がはるかに簡単です。新しいユーザーは、少なくともわずかに理解できるように見えることがよくあります。それ自体が合理的な目標です。
C++ 構造体と C++ クラスの間にはそのような違いはなく、ほとんどすべての機能を構造体でもクラスと同じように実行できますが、構造体は C++ で徐々に変更/進化し、クラスとして名前が付けられた C キーワードです。A 私たちは C++ を使用しているため、構造体ではなくクラスを使用することをお勧めします。
たとえば、C++ でコーディングを行ったことがあり、Java で作業している人が 2 か月後にコードをレビューするためにやってきた場合、「構造体」を使用したコードと「クラス」を使用したコードのどちらを理解するのが快適だと思いますか?