C ++クラスを完成した後、構造体/クラスは、いくつかの小さな違いを除いて実質的に同じであるように見えました。
私はこれまでCでプログラミングしたことがありません。しかし、私はそれが構造を持っていることを知っています。Cでは、他の構造体を継承し、パブリック/プライベートの修飾子を設定することは可能ですか?
これを通常のCで実行できる場合、なぜ世界中でC ++が必要なのでしょうか。クラスと構造体の違いは何ですか?
C ++クラスを完成した後、構造体/クラスは、いくつかの小さな違いを除いて実質的に同じであるように見えました。
私はこれまでCでプログラミングしたことがありません。しかし、私はそれが構造を持っていることを知っています。Cでは、他の構造体を継承し、パブリック/プライベートの修飾子を設定することは可能ですか?
これを通常のCで実行できる場合、なぜ世界中でC ++が必要なのでしょうか。クラスと構造体の違いは何ですか?
回答:
C ++では、構造体とクラスはほとんど同じです。唯一の違いは、クラスのアクセス修飾子(メンバー変数、メソッド、および基本クラスの場合)がデフォルトでプライベートになり、構造体のアクセス修飾子がデフォルトでパブリックになることです。
ただし、Cでは、構造体は単なる(パブリック)データの集合体であり、他のクラスのような機能はありません。メソッド、コンストラクター、基本クラスなどはありません。C++はキーワードを継承しましたが、セマンティクスを拡張しました。(ただし、構造体ではデフォルトでpublicになっています。C構造体のように書かれた構造体は、構造体のように動作します。)
CでOOPの一部を偽造することは可能ですが、たとえば、すべてが構造体へのポインターを最初のパラメーターとして取る関数を定義したり、最初の数フィールドが同じである構造体を「サブクラスまたはスーパークラス」に強制変換したりすることができます。ボルトで固定されており、実際には言語の一部ではありません。
デフォルトのアクセス(パブリック/プライベート)に違いがあること以外は、違いはありません。
ただし、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でのみ動作します
現在の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
};
Class
esは、たとえば相互に派生したメンバーや相互に関連しているメンバーに適しています。また、インスタンス化の際の健全性チェックにも役立ちます。Struct
■「バッグのデータ」を保持するのに適しています。実際には特別なことは何も行われていませんが、メンバーは論理的にグループ化されています。
このことから、class
カプセル化やその他の関連するコーディング概念をサポートするためにが存在することは理にかなっていstruct
ます。
struct
sは最もポータブルです。これらは、CまたはC ++、あるいはその前後で使用できます。struct
たとえば、モジュールを使用してPythonで解凍することもできます。プロジェクトの優先順位付けは、他の言語、インターフェイスやシステムとの互換性がある場合は、好むstruct
オーバーclass
。厳密にプログラム内部の業務には、をお勧めしclass
ます。
Cでメンバー関数を定義したり、互いに構造体を派生させたりすることはできません。
また、C ++はC + "構造体を派生させる"だけではありません。テンプレート、参照、ユーザー定義の名前空間、およびオペレーターのオーバーロードはすべてCには存在しません。
struct
私は主に受動的なPODタイプの物を意味します。
std::less
)がクラスではなく構造体として定義されていることです。
C ++は、主に1)Cとの下位互換性および2)PODタイプのために構造体を使用します。C構造体には、メソッド、継承、または可視性はありません。
std::less
)がクラスではなく構造体として定義されていることです。