C ++ではいつクラスと構造体を使用する必要がありますか?


950

C ++でstructaとa を使用した方が良いシナリオは何classですか?


48
これは、C ++だけでなく、構造体とクラスの両方を提供する言語にも当てはまります。
Jason Bunting

3
私はまだ同意しません-私はこの質問に意味的に取り組みます。技術的な違いがあるかもしれませんが、意味的には違いません。構造体は値型を作成するのに本当に役立ちますが、クラスはそうではありません。
Jason Bunting

4
C ++で構造体を使用する重大な理由はないと思います。私にとって構造体は、typedefのように、Cとの互換性のためだけに存在するC ++のもう1つの冗長な「機能」です。C ++が最初にCの拡張として扱われず、Javaなどのゼロから設計された場合、これらは存在しません。一般的に、C ++の奇妙なことの多くはCの互換性と関係があると思います。
Kostas

5
Struct-POD(プレーンな古いデータ)およびすべてのメンバーのアクセシビリティが公開されています。クラス-より良いカプセル化が必要で、クラスの状態を処理するメンバー関数が必要な場合。
Navaneeth KN、

4
これは慣例によってのみ当てはまります。デフォルトのカプセル化を除いて、違いはありません。
Dave Hillier、

回答:


805

C ++のa classとaの違いstructは、構造体にはデフォルトのpublicメンバーとベースがあり、クラスとクラスにはデフォルトのprivateメンバーとベースがあることです。クラスと構造体の両方にpublicprotectedprivateメンバーを混在させることができ、継承を使用でき、メンバー関数を持つことができます。

クラスのような機能のないプレーンな古いデータ構造として構造体を使用し、privateデータおよびメンバー関数を含む集合データ構造としてクラスを使用することをお勧めします。


100
修飾子やメソッドのない構造体はPOD構造体と呼ばれ、C構造体であるかのようにレイアウトされることが保証されているため(おそらく)、Cライブラリとの下位互換性のあるインターフェイスとして存在します。ただし、この1つの例外を除いて、唯一の違いは前述のとおりです。
workmad3 2008

26
@ workmad3:名前は誤解を招くかもしれませんが、9/4(C ++ 03)は次のように述べています。 (またはそのようなタイプの配列)または参照であり、ユーザー定義のコピー割り当て演算子もユーザー定義のデストラクタもありません。」「struct」クラスキーの使用に関する制限はなく、「public」の使用に関する制限はありません(総要件については8.5.1 / 1を参照)。これは、「構造体」と「クラス」の違いではありません。

5
標準の定義を考えると、「集約」の使用は誤解される可能性があります。:)

3
Stroustrupの「Principles and Practice」の本によれば、「構造体は主に、メンバーが任意の値をとることができる場所で使用する必要があります」(つまり、意味のあるクラス不変式を定義できない場合)
Antibus

6
もちろん、Cとのインターフェース時にクラスを使用できます。クラスと構造体の間に違いはありません。構造体はクラスです。デフォルトのアクセスのみがプライベートからパブリックに切り替えられます。
セバスチャンマッハ

230

他の誰もが指摘するように、実際の言語の違いは実際には2つだけです。

  • structデフォルトはパブリックアクセスで、classデフォルトはプライベートアクセスです。
  • 継承する場合、structデフォルトはpublic継承、classデフォルトはprivate継承です。(皮肉なことに、C ++での多くのことと同様に、デフォルトは逆方向です。public継承がはるかに一般的な選択ですがstruct、「public」キーワードの入力を節約するためだけにsを宣言することはほとんどありません。

ただし、実際の違いは、コンストラクタ/デストラクタを宣言するclass/ structと宣言しない/の違いです。「plain-old-data」PODタイプには特定の保証があり、クラスの構造を引き継ぐと適用されなくなります。この区別を明確にするために、多くの人は故意structにPODタイプにのみsを使用し、メソッドを追加する場合はclassesを使用します。以下の2つのフラグメントの違いは、それ以外では意味がありません。

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(ちなみに、ここにある「PODタイプ」が実際に何を意味するかについていくつかの良い説明があるスレッドがあります:C ++のPODタイプとは何ですか?


継承の違いに関する良い例:ここ
Liran Orevi

8
あなたはどちらを使用するかstruct、またはclassあなたのオブジェクトがPODであるかどうかには関係ありませんか、コピーコンストラクタ/デストラクタを定義する必要があるかどうか。メンバー関数も、PODであるものには関係ありません。私があなたが書いたものをもう一度読んでいるとき、私はあなたが別のことを示唆していないことを理解しますが、現在の言葉遣いは混乱しています
David Stone

1
@DavidStone基本的に、POD構造体はCコードとの下位互換性が保証されているため、基本的にはCスタイルの構造体として設計されているだけです。
ジャスティン時間-モニカを

3
この答えの「本当の違い」の部分は完全に間違っています。
juanchopanza 2017

178

既存の回答には多くの誤解があります。

両方classstructクラスを宣言します。

はい、クラスの宣言に使用したキーワードによっては、クラス定義内のアクセス変更キーワードを再配置する必要がある場合があります。

ただし、構文を超えて、どちらかを選択する唯一の理由は、規則/スタイル/設定です。

struct結果の定義はCの単純な構造のように見えるので、一部の人々はメンバー関数のないクラスのキーワードを使い続けることを好みます。

同様に、classメンバー関数とprivateデータを含むクラスにキーワードを使用することを好む人もいます。これは、キーワードが「クラス」であるため、オブジェクト指向プログラミングに関するお気に入りの本の例のように見えるためです。

実際には、これは完全にあなたとあなたのチーム次第であり、あなたのプログラムに文字通り何の違いももたらさないでしょう。

次の2つのクラスは、名前を除いてすべての点で完全に同等です。

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

再宣言時にキーワードを切り替えることもできます。

class Foo;
struct Bar;

(ただし、これは非準拠のためにVisual Studioビルドを破壊するため、これを行うとコンパイラーが警告を発します。)

および次の式はどちらもtrueと評価されます。

std::is_class<Foo>::value
std::is_class<Bar>::value

ただし、再定義するときにキーワードを切り替えることはできません。これは、(1つの定義の規則に従って)翻訳単位間で重複するクラス定義が「同じトークンのシーケンスで構成される」必要があるためです。この手段は、あなたも交換することはできませんconst int member;int const member;、との意味とは何の関係もありませんclassかをstruct


16
これは非常に有益で、正直なところ私のお気に入りの答えでした。他の誰もがそれらを別々のエンティティとして扱い、フードの下では同じです。Arduino環境での構造体定義は、g ++を使用してコンパイルされているため、cppクラスと見なされているのでしょうか。
ベンジャミン

4
@ベンもちろんです。ArduinoコンパイラはC ++をコンパイルします。これで終わりです。
underscore_d

7
したがって、私がこの権利を理解している場合:可視性修飾子が明示的であり、省略されていない限り、それは重要ではありません。構造体のみを使用して巨大なC ++アプリケーションを作成できます。または、構造体のすべてのケースを通過してクラスに変更することもできます。デフォルトの可視性を使用していない限り、アプリケーションはまったく同じです。
Ryan Lundy

「完全に同等」の主張によれば、C ++プログラムの1つの翻訳単位が完全な宣言をclass foo { public: ... };持ち、別の翻訳単位がそれを満たしている必要があるとは確信していませんstruct foo { ... };。不完全な宣言struct foo;class foo;互換性があるのは理にかなっています。これらはクラス本体を指定しないため、アクセスレイアウトには何も話しません。
Kaz

@カズ:その通り-定義が文字通り同じ型である場合、動作を明確に定義するには、定義が字句的に同一である必要があります。構造体キークラスキーが(セマンティクスは影響されない場合)しかしそうでない場合は、論理的に交換可能であり、FooかつBar、まだ同等/同じタイプです。私は必ず「再宣言するとき」と言って例を挙げました。私は確信して私はUBに人々を誤解ないよ作るための答えでこれを明らかにするだろう、考えてみれば
軌道上での明度レース

54

クラスの代わりに構造体を使用するのは、関数呼び出しで使用する直前にファンクタを宣言し、明確にするために構文を最小限にしたい場合のみです。例えば:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

35
数年後の今、C ++ 11はすべての主要なコンパイラーでサポートされているので、Lambdaはこれをさらに簡潔にします。

36

C ++よくある質問Liteは

構造体のメンバーと基本クラスはデフォルトでパブリックですが、クラスではデフォルトでプライベートになります。注:デフォルトに依存するのではなく、基本クラスを明示的にパブリック、プライベート、または保護する必要があります。

その他の点では、構造体とクラスは機能的に同等です。

さて、きしむクリーンなテクノの話はこれで十分だ。感情的には、ほとんどの開発者はクラスと構造体を強く区別します。構造体は、カプセル化や機能の点で非常に小さなビットの山のように感じられます。クラスは、インテリジェントサービス、強力なカプセル化バリア、明確に定義されたインターフェイスを備えた、社会の生きた責任あるメンバーのように感じます。それはほとんどの人がすでに持っている意味合いなので、メソッドがほとんどなく、パブリックデータがあるクラスがある場合は、おそらくstructキーワードを使用する必要があります(適切に設計されたシステムにそのようなものが存在します)。それ以外の場合は、おそらくクラスを使用する必要がありますキーワード。


1
構造体とクラスが機能的に同じであると彼らが述べている理由はわかりませんが、理由のない特定のケースではどちらか一方を優先するように言っています..
deetz

3
理由は慣習です。コンパイラーはどちらを使用するかは関係ありませんが、コードを調べている別の開発者は、あなたが何を意味しているのかを理解しやすくなります。
Tal Pressman 2017年

3
@deetz:3番目の段落全体が推論です。
オービットのライトネスレース

うわー、「古い学校」から来たので、構造体にメソッドや継承さえあるとは思いもしませんでした。メソッドなしでデータのみを使用する場合は常にstructを使用してきましたが、通常は、structを必要とするAPIコードを処理する場合に使用します。構造体は多重継承もサポートできますか?
ポールマッカーシー

21

構造体が私に役立つ1つの場所は、別のシステムから固定形式のメッセージ(たとえば、シリアルポート)を受信するシステムがある場合です。バイトストリームをフィールドを定義する構造体にキャストして、フィールドに簡単にアクセスできます。

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

明らかに、これはCで行うのと同じことですが、メッセージをクラスにデコードする必要があるというオーバーヘッドは、通常、その価値がないことに気づきます。


同じことがCで達成することができる
ユージーンBujak

11
それとも、ただ実装できるoperator >>代わりに、書き込みのクラスにprocessMessageあなたのCになるだろう機能を、++より適切なC ++のような、より少ないC.ように見える
ニックBastin

1
異なるシステム間での移植性がないという事実に加えて、これはエイリアシングルールに違反しているため、単一のアーキテクチャ内でも機能するとは限りません。
underscore_d

@underscore_dこれはプラットフォーム(コンパイラではない)で機能しますが、固定ビットフィールドと__packed__構造体を使用し、エンディアン対応のifdef実装を使用する必要があります(エンディアンが外部データソースと反対のマシンで順序を逆にする必要があります)提供しています)。それはきれいではありませんが、私は移植可能な方法で組み込みプラットフォーム上のリモート周辺機器のレジスタをパック/アンパックするために使用しました。
17

1
@jacwahええ、良い点。ポインタの1つはchar型であり、エイリアスは免除されるため、エイリアスはここでは問題になりません。ただし、char*別のタイプではありますが、まだ問題があります。aを別のタイプにキャストしても、そのアドレスで初期化されている後者のタイプのオブジェクトが実際に存在しなかった場合、UBは存続期間のルールに違反するためです。Afaikは、宛先の型が簡単に構築できる場合でも、メモリを割り当てただけでは、C ++がそのメモリをその型として正式に扱うことを許可するには不十分です。
underscore_d

19

内部がC ++であるライブラリを作成しているが、APIはCまたはC ++コードのいずれかで呼び出すことができる場合は、C ++で「構造体」を使用できます。次のように、CとC ++の両方のコードに公開する構造体とグローバルAPI関数を含む単一のヘッダーを作成するだけです。

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

次に、C ++コードを使用してC ++ファイルに関数bar()を記述し、Cから呼び出し可能にして、宣言された構造体を介して2つのワールドでデータを共有できます。もちろん、CとC ++を混在させる場合には他にも注意点がありますが、これは簡略化した例です。


2
最適な答え。C互換性が本当に最も重要な理由です。デフォルトのアクセスのような他のすべてのものは難解です。
Valentin Heinitz、2015年

16

すべての人が言うように、唯一の本当の違いはデフォルトのアクセスです。しかし、いくつかのヘルパーメソッドを実装していても、単純なデータクラスでカプセル化をしたくない場合は、特にstructを使用します。たとえば、次のようなものが必要な場合:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

1
+1は、「構造を取り除いた」ように感じられないメンバー関数を持つ構造の例を示すために使用します。
アインポクルム2017

9

自分の質問に(恥知らずに)答えるには、既に述べたように、C ++でのアクセス権の違いのみです。

構造体はデータストレージのみに使用する傾向があります。データの操作が簡単になる場合は、いくつかのヘルパー関数を取得できるようにします。ただし、データがフロー制御(つまり、内部状態を維持または保護するゲッター/セッター)を必要とするか、主要な機能(基本的にはオブジェクトのようなもの)の取得を開始するとすぐに、意図をより適切に伝達するためにクラスに「アップグレード」されます。


9

構造体(POD、より一般的には)は、C ++実装を備えたC互換のインターフェースを提供する場合に便利です。それらは言語の境界やリンカー形式を越えて移植できるためです。

それがあなたにとって問題ではないのであれば、「クラス」の代わりに「構造体」を使用することが意図のコミュニケーターであると思います(@ZeroSignalが上で述べたように)。構造体は、より予測可能なコピーセマンティクスも備えているため、外部メディアに書き込んだり、ネットワーク経由で送信したりする予定のデータに役立ちます。

構造体は、依存するtypedefの束を公開するだけの特性テンプレートなど、さまざまなメタプログラミングタスクにも便利です。

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

...しかし、それは構造体のデフォルトの保護レベルが公開されていることを実際に利用しているだけです...


1
それはPODの正しい使い方ではありません。構造体(またはクラス)は、PODメンバーのみが含まれている場合(かつその場合のみ)にPOD構造体になることができます。
マーティンヨーク

4
「予測可能なコピーのセマンティクス」:意味はクラスの場合と同じです(同じ問題があります(浅いコピー))。
マーティンヨーク

2
この投稿は、すべての構造体がPODであることを(できれば偶然に)信じてもらいます。これはまったく真実ではありません。これによって人々が誤解されないように願っています。
マイケルドースト2014

8

C ++の場合、構造体とクラスの違いはほとんどありません。主な機能上の違いは、構造体のメンバーはデフォルトでパブリックであるのに対し、クラスではデフォルトでプライベートであることです。そうでなければ、言語に関する限り、それらは同等です。

そうは言っても、ブライアンが言ったことと同様に、C#でのようにC ++でも構造体を使用する傾向があります。構造体は単純なデータコンテナーですが、クラスは、データを保持するだけでなく、データを操作する必要があるオブジェクトに使用されます。


4

それらはほとんど同じものです。C ++の魔法のおかげで、構造体はクラスのように、関数を保持したり、継承を使用したり、「新規」を使用して作成したりすることができます。

唯一の機能的な違いは、クラスはプライベートアクセス権で始まり、構造体はパブリックで始まるということです。これは、Cとの下位互換性を維持するためのものです。

実際には、構造体をデータホルダーとして使用し、クラスをオブジェクトとして使用してきました。


4

他の人が指摘したように

  • どちらもデフォルトの可視性を除いて同等です
  • 何らかの理由でどちらか一方を使用することを余儀なくされる理由があるかもしれません

Stroustrup / Sutterからwhichをいつ使用するかについての明確な推奨事項があります。

クラスに不変式がある場合はclassを使用します。データメンバーが独立して変化できる場合は、構造体を使用します

ただし、sthをフォワード宣言するのは賢明ではないことに注意してください。クラス(class X;)として、それをstruct(struct X { ... })として定義します。一部のリンカー(g ++など)では機能し、他のリンカー(MSVCなど)では失敗する可能性があるため、開発者の地獄にいることになります。


これらのリンカーの問題を説明できますか?
にオービットでライトネスレース

@LightnessRacesinOrbit残念ながらできません。私も例を作ることはできません。ささいなclass Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }ことは、MSVC 2017でコンパイルして実行するだけでなく、Foo宣言されたstructがとして定義された明確な警告を生成しclassます。しかし、私はまた、その愚かなバグを見つけるのに半日かかることをはっきり覚えています。当時使用していたMSVCのバージョンがわかりません。
pasbi

リンカーは、あなたが使用したか前方宣言であるかについてさえ知る必要はなく、2つは標準に従って自由に交換可能です(ただし、VSが警告することはわかっていますが、プログラマーの明らかな間違いを避けるためだけであると常に想定していました)。ここで何かにおいがしません。ODR違反のバグではなかったのですか?classstruct
オービットのライトネスレース


正確には覚えていません。この問題はアプリケーションで直接発生したのではなく、gtestで使用されたライブラリーで発生しました。リンカーが理解できないエラー(LNK ???)を生成したことを知っています。struct-forwardsをclass-forwards に置き換えると、問題はなくなりました。今日も不思議です。あなたがそれに光を当てることができれば私はうれしいです。
pasbi

3

クラス。

クラスのメンバーはデフォルトでプライベートです。

class test_one {
    int main_one();
};

に相当

class test_one {
  private:
    int main_one();
};

だからあなたがしようとすると

int two = one.main_one();

エラーが発生しmain_one is privateます。アクセスできないためです。パブリックを指定して初期化することで解決できます。

class test_one {
  public:
    int main_one();
};

構造。

構造体は、デフォルトでメンバーがパブリックであるクラスです。

struct test_one {
    int main_one;
};

手段main_oneはプライベートです

class test_one {
  public:
    int main_one;
};

私は、メンバーが任意の値を取ることができるデータ構造に構造体を使用していますが、その方が簡単です。


3

struct以上の利点は、class「最初のパブリックメンバー、次にプライベート」に準拠している場合、コードを1行節約できることです。この観点から、このキーワードはclass役に立たないと思います。

ここにのみ使用し、使用しない別の理由がstructありclassます。C ++の一部のコードスタイルガイドラインでは、関数マクロに小文字を使用することを推奨しています。その理由は、マクロをインライン関数に変換するときに、名前を変更する必要がないためです。こっちも一緒。素敵なCスタイルの構造体があり、ある日、コンストラクタまたは便利なメソッドを追加する必要があることがわかりました。に変更しますclassか?どこにでも?

structsとclassesを区別するのは、私たちがやるべきこと、つまりプログラミングのやり方にたどり着くのが面倒すぎます。多くのC ++の問題と同様に、それは後方互換性に対する強い欲求から生じます。


なぜそれをに変更する必要があるのclassですか?structキーワードで定義されたクラスはメンバー関数またはコンストラクターを持つことができないと思いましたか?
オービットのライトネスレース

@LightnessRacesinOrbitが原因で、1。一貫性と2.一部の静的アナライザーが1.の違反について不満を言う
Vorac

それはついていません。他にどのような「一貫性」を守っていますか?メンバーが呼び出されるすべてのクラスは、キーワードjoe()で定義する必要がありますclassか?少なくとも4つのintメンバーを持つすべてのクラスは、structキーワードで定義する必要がありますか?
オービットのライトネスレース

@LightnessRacesinOrbitイディオムを参照しています。「POD集計はで定義されstruct、メソッド付き集計はclass」で定義されています。面倒すぎる。
Vorac

2

デフォルトは異なりますが(デフォルトでclassはプライベート、デフォルトではパブリックstruct)異なるため、理論的には完全に互換性があります。

そのため、移動するためにいくつかの情報をパッケージ化したいだけの場合は、構造体を使用します。データメンバーに直接ではなく、メソッドを介して主に使用される、ほとんど不透明なものである場合は、完全なクラスを使用します。


2

構造体にはデフォルトでパブリックアクセスがあり、クラスにはデフォルトでプライベートアクセスがあります。

個人的には、データ転送オブジェクトまたは値オブジェクトとして構造体を使用しています。このように使用する場合、他のコードによる変更を防ぐために、すべてのメンバーをconstとして宣言します。


2

どちらも内部的structclassは同じstructですが、可視性に関するデフォルトは異なりますが、デフォルトはパブリックであり、classデフォルトはプライベートです。あなたは、適切な使用と他のようにどちらか一方を変更することができますprivateし、public。どちらも継承、メソッド、コンストラクタ、デストラクタ、およびオブジェクト指向言語のその他すべての利点を許可します。

ただし、2つの大きな違いの1つはstruct、キーワードとしてCではサポートされているのに対し、サポートされてclassいないことです。1が使用できるこれが意味structすることができ、インクルードファイルに#include限り、C ++またはCのいずれかにstructプレーンなCのスタイルであるstructファイルを含めるにし、他のすべてがすなわちなどがないC ++固有のキーワード、Cとの互換性がありprivatepublicいや、メソッド、継承なしなどなど

ACスタイルstructは、Cスタイルの使用をサポートする他のインターフェースと併用structして、インターフェースを介してデータをやり取りすることができます。

Cスタイルstructは、メモリ領域のレイアウトを記述する一種のテンプレート(C ++テンプレートではなく、パターンまたはステンシル)です。長年にわたり、CおよびCプラグイン(ここではJavaとPythonおよびVisual Basicを参照)で使用可能なインターフェースが作成されており、その一部はCスタイルで動作しstructます。


1

技術的には両方ともC ++で同じです。たとえば、構造体がオーバーロードされた演算子を持っている可能性があります。

しかしながら :

複数のタイプの情報を同時に渡したい場合は構造体を使用します。「関数型」オブジェクトを処理している場合はクラスを使用します。

それが役に立てば幸い。

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

たとえば、私はここでget ...()メソッドで学生構造体を返しています-楽しんでください。


1

いつstructを使用し、いつC ++でclassを使用するかを選択しますか?

structを定義するときに使用functorsPODます。それ以外の場合は使用しますclass

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

1
この回答は年齢の兆候を示しています:) std::binary_function<>は非推奨ではなく、c ++ 17でも削除されます。
sehe

15年前に定義された言語であるC ++ 03の時代に書かれたので、それほど驚くことではありません。
オービットのライトネスレース

1

PODタイプまたはファンクタを作成する必要がある場合は、構造体を使用します。


1

すべてのクラスメンバーはデフォルトでプライベートであり、すべての構造体メンバーはデフォルトでパブリックです。クラスにはデフォルトのプライベートベースがあり、ストラクトにはデフォルトのパブリックベースがあります。Cの場合の構造体はメンバー関数を持つことができませんが、C ++の場合のように、構造体にメンバー関数を追加することができます。これらの違い以外に、私はそれらについて驚くべきことは何も見つけません。


0

メンバー関数を関連付けずに(メンバーデータを操作するために)データを保持し、データ変数に直接アクセスする必要がある場合にのみ、構造体を使用します。

例:ファイルやソケットストリームなどからのデータの読み取り/書き込み。関数の引数が多すぎて関数の構文が長すぎる構造で関数の引数を渡す。

技術的には、デフォルトのアクセシビリティを除いて、クラスと構造の間に大きな違いはありません。さらにそれはあなたがそれをどのように使うかプログラミングスタイルに依存します。


-4

Structsはデータ構造(情報のマルチデータタイプ配列のような)として意図されており、クラスはコードパッケージング(サブルーチンと関数のコレクションのような)に組み込まれていると思いました。

:(


-6

C ++では「構造体」を使用しません。

意図的に混乱させようとしない限り、プライベートメンバーが必要なときに構造体を使用するシナリオを想像することはできません。

構造体を使用することは、データがどのように使用されるかを示す構文的な指示のようですが、クラスを作成し、クラスの名前で、またはコメントを使用してそれを明示的にすることをお勧めします。

例えば

class PublicInputData {
    //data members
 };

私によると、特にクラス名にコメントや名前を使用する場合は、「データの使用方法の構文表示」が構造体を使用するのに最適な理由です。
Viktor Sehr

2
structクラスのメンバーがデフォルトでパブリックになることをすでに明示的に宣言しませんか?
間違ったユーザー名
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.