2

クラスと構造体には(私が知る限り)それらの間に1つの違いがあり、structデフォルトはにpublicclassデフォルトはになっていprivateます。そして、同様の方法で使用される同様の種類のデータ型があることを知りましたunion。は継承unionのベースとして使用できませんclass(それが何を意味するのかわかりませんが、それでも受け入れます)。

struct// 、unionまたはそれらを交換可能に使用できる特定のインスタンスがあるかどうかを知りたいですかclass(私が参加した場合を除く)?私がどこか間違っているかどうか教えてください。よろしく

4

5 に答える 5

7

私の使用classstructおよびunionは次のとおりです。

  • class振る舞いのあるオブジェクトの場合。
  • structパッシブデータ用。
  • union異なるデータに異なるタイプとしてアクセスする必要がある非常に特殊なケースの場合。

私はずっと前にGoogleC++スタイルガイドunionでこれを読んでいて(要点を除いて)、それ以来それをフォローしていました。

sを使用structしてパッシブデータ(オブジェクトに動作がアタッチされていないオブジェクト)を伝送することには、メンバーのデフォルトの公開という利点があるため、ゲッターやセッターなしでアクセスできます。一部のメンバーデータを割り当てる前にチェック/変更する必要がある場合、または一部のメンバーデータを取得する前に計算/変更する必要がある場合、IMHOはSetter / Getterペアが必要であり、オブジェクトはのclass代わりになりstructます。

タイプについては、メンバーへの奇妙なアクセスを必要とする、または一部のコンテキストで一部のメンバーを別のタイプとして扱う必要がある、unionある種のデータ構造に役立つと思います。たとえば、3DベクトルまたはIPアドレス:

union 3DVector
{
    double x, y, z;
    double vector[3];
} v;

// Acess members with name
v.x = 6.0; v.y = 7.0; v.z = 8.0;
// Acess members as a vector
Normalize(v.vector);

union IPAddress
{
    int binary;
    char octet[4];
} ip;

// Acess the binary address
std::cout << std::hex << ip.binary << '\n';
// Print in a human-readable form
std::cout << static_cast<int>(ip.octet[0]) << '.'
          << static_cast<int>(ip.octet[1]) << '.'
          << static_cast<int>(ip.octet[2]) << '.' 
          << static_cast<int>(ip.octet[3]) << '\n';

上記の機能は、オーバーロード演算子と変換演算子で実現できますが、このunionアプローチは私にはわかりやすいように見えます。

unionsはテンプレート化することもでき、コンストラクタ/デストラクタを持つことができます。これは、シリアル化の目的で役立つ可能性があります(すべての種類のオブジェクトではありません)。

template <typename T> union Serializer
{
    Serializer(const T &o) : object(o) {}
    T object;
    char binary[sizeof(T)];
};

SomePODObject obj; // Only POD objects please!
Serializer s(obj);
SendBuffer(s.binary);
于 2013-01-23T14:49:44.880 に答える
3

ユニオンとクラスまたは構造は完全に異なります。ユニオンは同時にいくつかのものです。たとえば、文字配列と整数の両方にすることができますが、クラスまたは構造体は、論理的に接続された情報と、オプションでそれを操作するためのロジックをカプセル化する唯一のものです。ユニオンと他の2つのユースケースはまったく異なります。

私は通常、一部のデータのみを格納するときに構造体を使用しますが、それに関連付けられたロジックも必要な場合(つまり、メソッドを追加する必要がある場合)はクラスを使用します。

于 2013-01-23T14:00:11.837 に答える
1

私は決して組合を使いません。これを見ることになった場合は、ブーストバリアントを試してみてください。これを使用できる唯一の許容可能な状況は、カスタムシリアル化のように、コンテンツを詳細に制御する必要がある場合です。しかし、私は多くの場合これを使い果たします。

また、構造体はデータのみを格納するために使用されます。関数/メソッドを追加する必要がある場合は、それをクラスに変換します。

于 2013-01-23T14:09:47.807 に答える
0

struct私がオーバーを使用するかもしれないいくつかの領域がありますclass

  • 純粋仮想メソッドのみを含むインターフェースタイプを定義したい場合。structこれは、デフォルトで。に設定されている概念と一致していpublicます。
  • 純粋なデータのみのタイプ。タイプに動作が付加されていません。
  • 個人的な好みの問題として、ポリシーまたは特性のタイプ。

はaでもaでもunionありません。私は、メモリが貴重だったときに、識別されたタイプまたはバリアントタイプを作成するためにCでそれらを使用しただけでした。C ++では、一般的なアプリケーションではあまり利点がありませんが、組み込みアプリケーションや低メモリアプリケーションで使用される可能性があります。classstruct

于 2013-01-23T15:43:57.023 に答える
0

通常、構造体と共用体は、レジスタにアクセスするときにCで一緒に使用されます。構造体は各ビットを定義し、レジスタ内の各ビットを個別に設定できるようにすることができます。ユニオンを使用すると、すべてのビットを同時に変更またはアクセスできます。

C ++でも、ハードウェアをセットアップしてチップのレジスタに書き込む方法が必要です。

于 2013-10-03T00:39:56.070 に答える