web-dev-qa-db-ja.com

C / C ++構造体とクラス

C++クラスを終了した後、構造体/クラスは、いくつかの小さな違いを除いて実質的に同一であるように思われました。

Cでプログラミングしたことはありません。しかし、構造体があることは知っています。 Cでは、他の構造体を継承し、public/privateの修飾子を設定できますか?

これを通常のCで実行できる場合、なぜ世界でC++が必要なのですか?クラスと構造体の違いは何ですか?

103
anon235370

C++では、構造体とクラスはほとんど同じです。唯一の違いは、クラスのアクセス修飾子(メンバー変数、メソッド、および基本クラス)がデフォルトでprivateであるのに対し、構造体のアクセス修飾子はデフォルトでpublicであるということです。

ただし、Cの場合の場合、構造体は(パブリック)データの集合コレクションであり、他のクラスのような機能はありません。メソッド、コンストラクター、ベースクラスなどはありません。キーワード、セマンティクスを拡張しました。 (ただし、これが構造体のデフォルトをパブリックにする理由です。C構造体のように記述された構造体は、構造体のように動作します。)

いくつかのOOPを偽造することは可能ですが、たとえば、すべてが最初のパラメーターとして構造体へのポインターを取る関数を定義するか、時々最初のいくつかのフィールドは「サブ/スーパークラス」になります。これは常にボルトで固定されており、実際には言語の一部ではありません。

139

デフォルトアクセス(パブリック/プライベート)の違いを除いて、違いはありません。

ただし、CおよびC++でコーディングする一部のショップでは、「class/struct」を使用して、CおよびC++で使用できるもの(struct)とC++のみ(class)を示します。つまり、このスタイルでは、すべての構造体がCおよびC++で動作する必要があります。これが、C++が「C with Classes」としてまだ知られていた昔に最初の場所に違いがあった理由の一種です。

CユニオンはC++で機能しますが、逆には機能しないことに注意してください。例えば

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

そして同様に

typedef union friend{
    int a;
    float b;
} class;

cでのみ動作します

14
Lance Diduck

modern C++は今や公式であるため、既存の回答に追加しますCore Guidelinesこれらのような質問を支援するために作成されました。

ガイドラインの関連セクションは次のとおりです。

C.2:クラスに不変式がある場合はクラスを使用します。データメンバーが独立して変化する可能性がある場合は、構造体を使用します

不変式は、パブリックメンバー関数が想定するためにコンストラクターが確立する必要があるオブジェクトのメンバーの論理条件です。 (通常はコンストラクターによって)不変式が確立されると、オブジェクトのすべてのメンバー関数を呼び出すことができます。不変式は、非公式に(たとえば、コメントで)、またはより正式にExpectsを使用して記述できます。

すべてのデータメンバーが互いに独立して変化する可能性がある場合、不変式は不可能です。

クラスにプライベートデータがある場合、ユーザーはコンストラクタを使用しないとオブジェクトを完全に初期化できません。したがって、クラス定義者はコンストラクタを提供し、その意味を指定する必要があります。これは事実上、定義者が不変式を定義する必要があることを意味します。

施行

すべてのプライベートデータを持つ構造体とパブリックメンバーを持つクラスを探します。

指定されたコード例:

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Classesは、たとえば、相互に派生したメンバーや相互に関連するメンバーに対して適切に機能します。また、インスタンス化時の健全性チェックにも役立ちます。 Structsは、特別なことは何も行われていないが、メンバーが論理的にグループ化されていることを意味する「データの袋」を持つのに適しています。

このことから、カプセル化およびその他の関連するコーディングの概念をサポートするためにclassesが存在し、structsがあまり役に立たないことは理にかなっています。

6
Dave

Cでメンバー関数を定義したり、互いに構造体を派生したりすることはできません。

また、C++はC +「派生構造体」だけではありません。テンプレート、参照、ユーザー定義の名前空間、および演算子のオーバーロードはすべてCには存在しません。

C++のもう1つの違いは、アクセス指定子なしで構造体からクラスを継承すると、クラスの場合のようにプライベート継承であるパブリック継承になります。

3
MarsRover

C++は主に1)Cとの後方互換性および2)POD型のために構造体を使用します。 C構造体には、メソッド、継承、または可視性がありません。

1
Chris Hafey