クラスと構造体


12

C ++およびその他の影響を受ける言語には、Structure(struct)と呼ばれる構造体と、と呼ばれる別の構造体がありclassます。どちらも関数と変数を保持できます。いくつかの違いは次のとおりです。

  1. クラスには、ヒープ内のstructメモリが割り当てられ、スタック内のメモリが割り当てられます(注意:これはC ++では間違っていますが、OPが「影響を受けた言語」と呼んだものでは正しいかもしれません)
  2. クラス変数はデフォルトでプライベートであり、structそれらはパブリックです

私の質問はstruct、クラスはどういうわけか放棄されたのですか?もしそうなら、なぜですか?上記の違いをstruct除けば、クラスと同じことをすべて行うことができます。なぜそれを放棄するのですか?


放棄とは、一方が他方に対して使用される理由を意味します。
prometheuspk

あなたの質問はこれに答えていると思います。
Umair A.

3
クラスと構造体の違いは言語に依存します。C ++からのいくつかの教訓は、C#には実際には当てはまりません。
仕事

6
うん C ++では、オブジェクトをスタックまたはヒープに割り当てることができます。どこでも好きです。
ジョジョ

8
間違っている、間違っている、間違っている。スタックとヒープは違いとは関係ありません
アーロンノート

回答:


11

それはまったく放棄されていません。実際、C#のような最新の言語でさえも、それを多用しているので、classまだ提供していますstruct。どちらを選択するのが便利かについては、この記事を参照してください。

クラスと構造の選択

MSDNの記事から引用:

型のインスタンスが小さく、一般に短命であるか、一般に他のオブジェクトに埋め込まれている場合、クラスではなく構造を定義することを検討してください。

タイプに次のすべての特性がない限り、構造を定義しないでください。

  • 論理的には、プリミティブ型(整数、倍精度など)と同様に単一の値を表します。
  • インスタンスのサイズは16バイト未満です。
  • 不変です。
  • 頻繁に箱詰めする必要はありません。

4
.Net / C#struct / classの意味はC ++の意味とは異なるため、この答えは本当に見当違いです。同じ名前を使用しますが、言語によって意味が異なります!!! C ++では、structとclassの間にほとんど違いはなく、最初の点で質問は完全に間違っています。c#とDでは正しいですが、c ++では違います。したがって、.Netに関するこの記事へのリンクは本当に間違っています。C ++ではありません!
クライム

@Klaimは技術的にそのない右C#のいずれか(構造体は、ヒープにすることができます)のためのC#での重要な違いは、値のセマンティクスおよび参照セマンティクスの間で、それは何のための値または参照することができように、C ++を必要としないことの区別である
JKを。

17

C ++について誤解されています。クラスと構造体の唯一の重要な違いは、デフォルトのアクセス指定子の違いです。構造体とクラスはすべての意図と目的の同義語であり、構造体はCとの後方互換性のために保持されていると思います。


7
だけでなく。Structは、1つのオブジェクトに大量のデータをダンプし、動作を追加しない場合に適しています。
quant_dev

2
@quant:それは構造体を使用する恐ろしい理由です。私はコメントがおしゃべりであったことを本当に願っています。
アーロンノート

1
@Aaronaughtなぜ?構造体の使用に関する私の見解は、かなり標準的である、例えばこの回答を参照してください。stackoverflow.com/questions/54585/...
quant_dev

1
@Aaronaughtでは、複数の値をどのように返しますか?たとえば、プロシングモデルは、クリーンな価格、ダーティな価格、および未払いの支払いの合計を返します。
quant_dev

1
@quant_dev-目的のためにメタ意味を構造体に付加することを決定できます(そして、以前のCプログラマーにとっては実際に多くの意味を成します)。しかし、それは構造体とC ++のクラスキーワードがデフォルトのアクセスです。
ジョリスティマーマンズ

2

言語Dは、クラスと構造体の間に大きな区別を作成しました。

dの構造体は、呼び出すことができるいくつかの関数を含むスタックに割り当てられたデータレコードに過ぎません(enum + unionのセットアップを使用しない限り、継承のオプションはありません。つまり、ポリモルフィズムを自分で実装します)

クラスは、仮想関数、ヒープ割り当て、(単一の)継承、参照渡し

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.