クラスがC++で導入された理由を教えてください。構造を使用して達成できない、クラスが実行できることはありますか?
4 に答える
ここでStroustrupの説明を読んでください:クラスの何がそんなに素晴らしいのですか?
クラスは、コード内のアイデア、概念の表現です。クラスのオブジェクトは、コード内のアイデアの特定の例を表します。クラスがないと、コードの読者はデータ項目と関数の間の関係を推測する必要があります。クラスはそのような関係を明示的にし、コンパイラーによって「理解」されます。クラスを使用すると、コメントだけでなく、プログラムの高レベルの構造の多くがコードに反映されます。
適切に設計されたクラスは、ユーザーにクリーンでシンプルなインターフェイスを提供し、その表現を非表示にして、ユーザーがその表現について知る必要がないようにします。表現を非表示にしない場合(たとえば、ユーザーは任意のデータメンバーを好きなように変更できる必要があるため)、そのクラスは「単なる古いデータ構造」と考えることができます。例えば:
struct Pair {
Pair(const string& n, const string& v) : name(n), value(v) { }
string name, value;
};
データ構造でさえ、コンストラクターなどの補助関数の恩恵を受けることができることに注意してください。
実際、C ++の構造体はクラスの特殊なケースであり、C ++とCの下位互換性を高めるために含まれています。構造体は、名前が付けられた潜在的に異なるタイプのデータ項目のコレクションの記述であることをCから思い出してください。これは、他の言語のレコードと呼ばれるものでもあります。
C ++には、クラスと呼ばれる基本的なものがあります。これは、潜在的に異なるタイプのデータ項目と、それらを操作する関数のコレクションです。
Cでは、構造体を使用すると、構造体宣言をパターンとして使用してメモリのチャンクを定義できます。
C ++では、クラスを使用すると、クラス宣言をパターンとして使用してメモリのチャンクを定義し、それを操作する関数に関連付けることができます。
Cでは、構造体を使って物事を行うための一般的なパターンは次のようなものです。
struct T {
?* some declarations */
};
struct T * foo.
struct T * create_a_T(}{/* malloc memory */}
void init_a_T(struct T * t){/* set it up */}
void do_something_with_T(struct T * t, ?* more arguments*/){/* more good things */}
C ++では、クラスメソッドはまったく同じように機能しますが、引数としてを持っている必要がない点が異なります。struct T *
それは自動的に処理されます。
これらすべてに加えて、C ++では、クラスを使用すると、クラスの特定の要素を「プライベート」または「保護」にすることができます。つまり、クラスメソッドの外部からはアクセスできません。これにより、さまざまな種類のプログラミングエラーから保護できます。
また、C ++では、継承を使用できます。これは、他のデータ宣言またはメソッドを追加するコードを除いて、既存のクラスと「同じ」新しいクラスを定義できることを意味します。これにより、「一種の」と呼ばれる関係を中心にコードを整理できます。たとえば、クラスCarを作成し、「一種の」車であるが特別なメルセデス関連の部品を含む新しいクラスのメルセデスを定義できます。 。
これはすべて、1つの答えで説明するには多すぎるが、大規模なプログラムを正しく構築することを容易にすることが歴史的に証明されている「オブジェクト指向プログラミング」の概念に沿っています。
class CL
{
int x;
};
struct ST
{
int x;
};
STとCLの唯一の違いは、CL.x
isprivate
とST.x
ispublic
です。
ベストプラクティス:パブリックオブジェクトのみを使用して小さなデータ構造を定義する場合は、キーワードstructを使用し、別の方法でキーワードクラスを使用します。
アップデート:
これは有効です->class A;
これは無効です->struct B; // error: forward declaration of struct B
C ++はオブジェクトを対象としており、オブジェクトはクラスによって作成されるため、C++はそれのみを使用します