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


108

C ++クラスを完成した後、構造体/クラスは、いくつかの小さな違いを除いて実質的に同じであるように見えました。

私はこれまでCでプログラミングしたことがありません。しかし、私はそれが構造を持っていることを知っています。Cでは、他の構造体を継承し、パブリック/プライベートの修飾子を設定することは可能ですか?

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

c++  class  struct 


回答:


146

C ++では、構造体とクラスはほとんど同じです。唯一の違いは、クラスのアクセス修飾子(メンバー変数、メソッド、および基本クラスの場合)がデフォルトでプライベートになり、構造体のアクセス修飾子がデフォルトでパブリックになることです。

ただし、Cでは、構造体は単なる(パブリック)データの集合体であり、他のクラスのような機能はありません。メソッド、コンストラクター、基本クラスなどはありません。C++はキーワードを継承しましたが、セマンティクスを拡張しました。(ただし、構造体ではデフォルトでpublicになっています。C構造体のように書かれた構造体は、構造体のように動作します。)

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


OOPからの見込みのある.Netの連中はこの方法でそれを定義しました X AVOIDは、型が次のすべての特性を持たない限り、構造体を定義します。1.プリミティブ型(int、doubleなど)と同様に、単一の値を論理的に表します。2. 16バイト未満のインスタンスサイズです。3.不変です。
Abhijeet

5
@AbhijeetこれはC#の構造体とクラスの違いですが、それは単にC ++には無関係であり、Cにはさらに無関係です。C#では、クラスと構造体は実際には異なります。C ++ではそうではなく、CにはOOのない構造体しかありません。
Antal Spector-Zabusky

C ++構造体で同じCセマンティックを維持した方がいいでしょうか?「C ++の方法で構造体」を使用する必要がある場合は、クラスを使用するだけですか?Cと比較して、C ++で「拡張された」構造体を使用するメリットはありません。Cで設計されている場所として構造体を使用するのが好きです。
ラファエロ

15

デフォルトのアクセス(パブリック/プライベート)に違いがあること以外は、違いはありません。

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

Cの共用体はC ++で機能しますが、逆は機能しません。例えば

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

同様に

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

Cでのみ動作します


9
cコードでcppキーワードを使用し、それをcpp互換性がないと主張することは、かなり愚かです
Dani

7

現在のC ++は現在のものであり、これらのような質問に役立つ公式のコアガイドラインが作成されているため、既存の回答に追加します。

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

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は、たとえば相互に派生したメンバーや相互に関連しているメンバーに適しています。また、インスタンス化の際の健全性チェックにも役立ちます。Struct■「バッグのデータ」を保持するのに適しています。実際には特別なことは何も行われていませんが、メンバーは論理的にグループ化されています。

このことから、classカプセル化やその他の関連するコーディング概念をサポートするためにが存在することは理にかなっていstructます。


もう1つの考慮事項は、移植性です。structsは最もポータブルです。これらは、CまたはC ++、あるいはその前後で使用できます。structたとえば、モジュールを使用してPythonで解凍することもできます。プロジェクトの優先順位付けは、他の言語、インターフェイスやシステムとの互換性がある場合は、好むstructオーバーclass。厳密にプログラム内部の業務には、をお勧めしclassます。
Dave

6

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

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


テンプレートなどがCに存在しないことは知っていますが、C powerの構造体を認識していませんでした。そのため、C ++は構造体のみを使用して、Cとの「後方」互換性を確保していますか?

4
下位互換性のためだけですか?実用的な根拠にはおそらく何かがあるかもしれませんが、区別は意図の合図である可能性があります。私が使用する場合、struct私は主に受動的なPODタイプの物を意味します。
dmckee ---元モデレーターの子猫

@dmckee:価値があるのは、ほとんどのSTLファンクタ(つまりstd::less)がクラスではなく構造体として定義されていることです。
Billy ONeal、

1
C ++はCと完全に互換性があるわけではありません。structキーワードは、C開発者への配慮と言えます。順序付けされた方法でデータを保持するだけで、(それ自体)ロジック自体を提供しないクラスのstructキーワードが好きです。
ypnos

@ypnos:私の最後のコメントを見てください。2つの唯一の違いは、一方のメンバーがデフォルトのパブリックであり、もう一方のメンバーがデフォルトのプライベートであることです。
ビリーONeal

3

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


1

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


2
価値があるのは、ほとんどのSTLファンクタ(つまりstd::less)がクラスではなく構造体として定義されていることです。
ビリーONeal

3
C ++構造体には、メソッド、継承、および可視性があることに注意してください。
robertwb 2015年

c構造体は、type(* addr)(params);として関数ポインタを含めることができます。
エラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.