1

私の理解が正しければ、次のセマンティクスが C++、C#、および D の構造体とクラスに適用されます。

        struct          class
----------------------------------
C++     stack/heap      stack/heap
        value/reference value/reference

C# / D  stack           heap
        value           reference

つまり、C++ では、構造体とクラスの間にセマンティックの違いはありません (デフォルトのパブリック/プライベート アクセスは別として)。対照的に、C# と D の構造体には値のセマンティクスとスタックの割り当て (少なくとも既定では) がありますが、C# と D のクラスには参照のセマンティクスとヒープの割り当てがあります。

私の質問は、値セマンティクスを持つすべてのエンティティに対して排他的に struct キーワードを使用し、参照セマンティクスを持つすべてのエンティティに対して排他的に class キーワードを使用して、この違いを模倣するのは良い C++ スタイルでしょうか?

もちろん、これはコンパイラによって強制されない自己規律ツールですが、特に C# / D のバックグラウンドを持つレビュアーにとって、コードの読みやすさを向上させることができます。OTOH、C++ の現在のイディオムは、純粋な POD 集計やテンプレート メタ関数などの単純なエンティティにのみ struct キーワードを使用するように思われるため、C++ プログラマーにとって混乱を招く可能性があります。

4

2 に答える 2

1

C++ では、構造体とクラスは、主にプライベート メンバーを持つクラスと構造体がデフォルトでパブリック メンバーを持つことを除いて、基本的に同じです。メモリが割り当てられる場所には影響しません。

これは好みの問題ですが、C++ では値オブジェクトに構造体を使用して値をグループ化し、値のセマンティクス (代入演算子、コンストラクターなど) を完全に実装する完全な機能を備えたコンストラクトにクラスを使用するのが一般的です。

クラスまたは構造体を動的メモリに配置するには、new 演算子を使用し、onobject へのポインターを用意する必要があります。

 my_object *mop=new my_object();

または、スマート ポインターを使用して参照カウントまたはスコープにライフ タイを結び付けます。

 std::unique_ptr<my_object> mop(new my_object());

または参照カウント

 std::shared_ptr<my_object> mop(new my_object());

ほとんどのアイテムに対して常にスタックを使用してみて、コンテナに大きなデータ構造を保持させる必要があります。

于 2012-04-16T14:18:32.743 に答える
1

それが唯一の関連する違いである場合、それは理にかなっているかもしれません. 実際には、それだけではありません。C++ では、実際に動作する (コピーをサポートしていない) オブジェクトがスタックに割り当てられることがよくあります。また、純粋なデータ コンテナーが動的に割り当てられることもあります。C# と D は、任意のオブジェクトの有効期間とスコープにリンクされたオブジェクトの有効期間、およびオブジェクトに値のセマンティクスがあるかどうかという 2 つの直交する区別を混同しています。これらの 2 つの区別が一部のタイプで一致することは事実ですが、これは絶対的なルールではなく、言語レベルでそれを課すとストレート ジャケットが作成され、最もクリーンで最も自然なソリューションの使用が妨げられることがあります。

于 2012-04-16T14:45:47.613 に答える