いつ型を構造体またはクラスとして定義する必要がありますか?
クラスが参照型であるのに対し、構造体は値型であることを知っています。たとえば、スタックを構造体またはクラスとして定義する必要があるのでしょうか。
いつ型を構造体またはクラスとして定義する必要がありますか?
クラスが参照型であるのに対し、構造体は値型であることを知っています。たとえば、スタックを構造体またはクラスとして定義する必要があるのでしょうか。
構造体とクラスを選択する理由 #1 : クラスには継承がありますが、構造体にはありません。ポリモーフィズムが必要な場合は、クラスを使用する必要があります。
理由 #2:構造体は通常、値型です (ただし、作業する場合は参照型にすることができます)。クラスは常に参照型です。したがって、値型が必要な場合は、構造体を選択してください。参照型が必要な場合は、クラスを使用するのが最も簡単です。
理由 #3:多くのデータ メンバーを持つ型がある場合は、おそらく (コストのかかるコピーを避けるために) 参照型が必要になるでしょう。その場合、おそらくクラスを選択することになります。
理由 #4:型の決定論的な破棄が必要な場合は、スタック上の構造体である必要があります。GC ヒープには決定論的な破壊が行われるものはなく、GC ヒープ上のもののデストラクタ/ファイナライザは決して実行されない可能性があります。GC によって収集された場合、ファイナライザーが実行されますが、それ以外の場合は実行されません。したがって、型がスコープを離れたときに型を自動的に破棄する場合は、構造体を使用してスタックに置く必要があります。
あなたの特定のケースに関しては、通常、コンテナは参照型である必要があり(要素を渡すたびにすべての要素をコピーすると、非常にコストがかかります)、 aStack
はコンテナであるため、クラスを使用する場合を除きます面倒なことに ref-counted 構造体にする必要がありますが、これは明らかにより多くの作業です。使用されなくなったときにデストラクタが実行されることを保証するという利点があります。
余談ですが、クラスであるコンテナーを作成する場合、おそらくそれを final にして、そのさまざまな関数をインライン化できるようにすることをお勧めします (そのクラスが何からも派生しない場合、仮想化されません)。これはObject
、Object
パフォーマンスが確実に重要になるコンテナのようなものにとって重要です。
「D」を読んでDプログラミング言語に飛び込む
Dでは、構造体を取得してから、クラスを取得します。それらは多くの機能を共有しますが、異なるチャーターを持っています。構造体は値型ですが、クラスは動的ポリモーフィズムを対象としており、参照によってのみアクセスされます。そうすれば、混乱、スライス関連のバグ、コメントàla//いいえ!継承しないでください!存在しない。タイプを設計するときは、それが単相値であるか多相参照であるかを事前に決定します。C ++は、あいまいな性別の型を定義できることで有名ですが、それらの使用はまれであり、エラーが発生しやすく、設計上それらを単に回避することを保証するのに十分なほど不快です。
タイプの場合、タイプの特定の実装をそのインターフェースに結び付けないように、最初にその実装を定義してから(を使用して)Stack
定義するのがおそらく最善です。interface
class
Stack