構造とユニオンの違い

著者: Laura McKinney
作成日: 1 4月 2021
更新日: 9 5月 2024
Anonim
線分、光線、線分、点、角度、和集合、交点-ジオメトリの基本的な紹介
ビデオ: 線分、光線、線分、点、角度、和集合、交点-ジオメトリの基本的な紹介

コンテンツ


C ++では、C言語が提供する5つの方法すべてを使用して、カスタムデータを作成できます。これらの5つの方法は、「構造」、「ビットフィールド」、「ユニオン」、「列挙」、「typedef」です。以下の記事では、構造とユニオンの違いを調べます。構造とユニオンはどちらも、任意の「タイプ」のデータを保持できるコンテナデータタイプです。構造体とユニオンを区別する1つの大きな違いは、構造体のメンバーごとに個別のメモリロケーションがあるのに対して、ユニオンのメンバーは同じメモリロケーションを共有することです。

比較チャートとともに、構造とユニオンの違いを理解しましょう。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 類似点
  5. 結論

比較表

比較の基礎構造連合
ベーシック構造体の各メンバーに個別のメモリ位置が割り当てられます。ユニオンのすべてのメンバーは同じメモリロケーションを共有します。
宣言struct struct_name {
タイプelement1;
タイプelement2;
.
.
} variable1、variable2、...;
union u_name {
タイプelement1;
タイプelement2;
.
.
} variable1、variable2、...;
キーワード構造連合
サイズ構造のサイズ=すべてのデータメンバーのサイズの合計。Unionのサイズ=最大メンバーのサイズ。
店舗価値すべてのメンバーの個別の値を格納します。すべてのメンバーに同じ値を格納します。
一度に構造体には、構造体の異なるメンバーの複数の値が格納されます。ユニオンは、すべてのメンバーに対して一度に1つの値を格納します。
見方各メモリ位置を表示する単一の方法を提供します。同じメモリ位置を表示する複数の方法を提供します。
匿名機能匿名機能はありません。匿名結合を宣言できます。

構造の定義

構造は、さまざまなデータ型の変数のコレクションであり、共通名で参照されます。構造内の変数は「メンバー」と呼ばれます。デフォルトでは、構造のすべてのメンバーは「パブリック」です。構造を宣言するとき、テンプレートを作成します。テンプレートを使用して、構造オブジェクトを作成し、データメンバとメンバ関数の同じ組織を共有できます。構造体の宣言の前には常にキーワード「struct」が付き、構造体が宣言されたことをコンパイラーに伝えます。例を見てみましょう。


例を見てみましょう。

struct employee {string name;文字列company_name;ストリングシティ; } emp1、emp2;

ここでは、従業員の情報を保存するための構造を宣言します。構造体宣言はステートメントであるため、宣言はセミコロンで終了します。C++では、ステートメントはセミコロンで終了します。

構造に付けられた名前は「タイプ」を定義します(上記の例では、構造の名前は「従業員」です)。上記のように、これらのタイプの変数を作成できます。「employee」タイプの2つの変数「emp1」と「emp2」を作成しました。上記の例では、宣言の直後に「構造」変数を作成しました。または、個別に作成することもできます。

struct employee emp1、emp2; //キーワード構造体は必須ではありません。

構造変数のメンバーは、初期化するか、dot(。)演算子を使用してアクセスできます。

emp1.name = "ashok";

1つの構造変数に含まれる情報は、次のように同じタイプの別の構造変数に割り当てることができます。

emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // emp1のメンバーの値をemp2に割り当てます。 cout <

ここでは、構造変数「emp1」を「emp2」に割り当てたため、「emp1」はそのメンバーのすべての値を「epm2」の対応するメンバーにコピーします。

構造変数のメンバーを関数に渡すことができます。

funct(emp1.city);

値で呼び出すメソッドと参照で呼び出すメソッドの両方で、構造変数全体を関数に渡すことができます。


funt(emp1); //値による呼び出しメソッドによる関数の呼び出し。 。 。 void funct(struct employee emp){// emp1のメンバーの値を受け取ります。 cout <

ここで、変数はvalueメソッドによる呼び出しによって渡されるため、構造変数のメンバーの値の変更は関数の外部には反映されません。参照メソッドによる呼び出しで同じことをしましょう。

funt(&emp1); //参照メソッドによる呼び出しによる関数の呼び出し。 。 。 void funct(struct employee * emp){// emp1のアドレスを受信します。 emp-> city = "Nur"; //構造変数emp1のmember(city)の値を変更します。 。 }

ここでは、構造変数は参照によって渡されるため、構造変数のメンバーの値への変更は関数の外側にも反映されます。

srtuct employee * emp; //従業員タイプの構造体ポインターを宣言します。 emp =&emp1; // emp1のアドレスをポインターに割り当てます。 emp-> city // emp1のメンバー都市にアクセスするポインター。

構造体へのポインタも作成できます。構造変数のアドレスを保持します。

構造体では、構造体定義にユーザー定義のコンストラクターまたは仮想関数、基本クラス、プライベートまたは保護フィールドが含まれていない場合、集約の初期化が許可されます。

int main(){struct epm3 = {"Anil"、 "Teckpix"、 "Nur"}; } //従業員の構造に上記のものが含まれていない可能性がある。

ユニオンの定義

ユニオンは、単一のユニオン型で宣言された2つ以上の異なるタイプの変数によって共有されるメモリ位置です。ユニオンの宣言に使用されるキーワードは「ユニオン」です。 C ++では、ユニオンにはメンバー関数と変数の両方が含まれる場合があります。デフォルトでは、組合のすべてのメンバーは「パブリック」です。 「組合」の宣言は、構造の宣言に似ています。

union u_type {int x、char c;フロートf; } u1、u2;

ここで、u_typeという名前の共用体を宣言しました。 u_typeのメンバーは、整数型の「x」、文字型の「c」、および浮動小数点型の「f」です。また、ユニオンの宣言直後に、「u_type」タイプのユニオン変数「u1」および「u2」を作成しました。ユニオンの宣言とは別に、ユニオン変数を宣言することもできます。

int main(){union u_type u1、u2; //キーワードユニオンはC ++では必須ではありません。 }

ユニオンのメンバーへのアクセスは、ドット(。)演算子を使用して行うことができ、その前にユニオン変数があり、その変数のメンバーが続きます。

u1.x = 10;

構造体と同様に、集合体の初期化はユニオンでは不可能です。ユニオンは一度にすべてのメンバーに対して同じメモリ位置を共有することがわかっているため、1つの変数のみが初期化され、すべての変数は初期化された値で自動的に更新されます。

u1.x = 10; cout <

「u1」のメンバーの値を変更しようとした場合。他のメンバーは自動的にその値に更新されます。

u1.c = 65; cout <

ユニオンに割り当てられるスペースは、ユニオンの最大メンバーのサイズに等しくなります。 「char」に割り当てられたバイトは1バイト、「int」は4バイト、「float」は4バイトなので、最大サイズは4バイトです。したがって、「u1」と「u2」に割り当てられるメモリは4バイトです。

int main(){int size_1 = sizeof(u1); // 4 int size_2 = sizeof(u2); // 4

構造体の場合と同様に、共用体へのポインターを作成できます。ポインターは、共用体のアドレスを保持しています。

union u_type * un; un =&u1; cout <バツ; // 10

構造体と同様に、共用体は、値による呼び出しと参照による呼び出しの両方のメソッドによって関数に渡すこともできます。

funct(u1); // valueメソッドによる呼び出しによる関数の呼び出し。 。 。 void funct(union u_type un){// u1のメンバーの値を受け取ります。 cout <

それでは、参照メソッドによる呼び出しを使用して関数を呼び出しましょう。

funct(&u1); // refrenceメソッドによる呼び出しによる関数の呼び出し。 。 。 void funct(union u_type un){// u1のアドレスを受信します。 un-> x = 20。 }

Anonymous Unionと呼ばれるC ++には特別なタイプの結合があります。匿名共用体には型名を付けることができず、そのような共用体の変数は作成できません。メンバー変数が同じ場所を共有することをコンパイラーに伝えるだけです。匿名共用体の変数は、通常のドット(。)演算子なしで参照できます。

int main(){union {//型名なしで匿名の共用体を定義します。 int x、char c;フロートf; }; x = 10; //アウトドット演算子cout <でユニオン変数を参照しました

匿名ユニオンでは、メンバー関数は許可されません。プライベートまたは保護されたデータを含めることはできません。グローバル匿名ユニオンは「静的」として指定する必要があります。

通常の労働組合宣言のために覚えておくべきポイント。

  • ユニオンの定義には、コンストラクターとデストラクターも含めることができます。
  • ユニオンは、同じメモリ位置を表示する複数の方法を提供します。
  • ユニオンはどのタイプのクラスも継承できません。
  • ユニオンを基本クラスにすることはできません。
  • ユニオンに仮想メンバー関数を含めることはできません。
  • ユニオンに静的変数を含めることはできません。
  1. 構造は、メンバーごとに異なるメモリ位置を使用します。したがって、すべてのメンバーに個別の値を割り当てることができます。しかし、組合はすべてのメンバーに同じ記憶場所を割り当てます。したがって、単一の値をすべてのメンバーに割り当てることができます。
  2. 構造には、すべてのメンバーに対して異なるメモリ位置があります。そのため、一度に複数の値を含めることができ、ユニオンがすべてのメンバーで同じメモリ位置を共有することがわかっているため、一度に1つの値を格納できます。
  3. 一般に、構造体のサイズは構造体のすべてのメンバーのサイズの合計であり、ユニオンのサイズはユニオンのメンバーのサイズであるため、構造体の合計サイズはユニオンの合計サイズよりも大きくなります。最大のタイプ。
  4. 構造体は各ロケーションの単一ビューを提供しますが、ユニオンは単一ロケーションの複数ビューを提供します。
  5. 匿名ユニオンを宣言できますが、匿名構造体は宣言できません。

類似点:

  • 構造体とユニオンの両方には、それ自体を宣言し、変数を作成し、変数のメンバーにアクセスする同じ方法があります。
  • 構造とユニオンの両方を、値による呼び出しと参照による呼び出しの両方のメソッドによって関数に渡すことができます。
  • 構造体とユニオンはどちらもコンテナデータ型であり、他の構造体、ユニオン、配列をメンバーとして含む任意のデータ型のオブジェクトを含みます。

結論:

構造とユニオンは両方とも、異なる型のメンバーを含むコンテナデータ型です。ただし、すべてのメンバーの個別の値を個別のメモリロケーションに格納する必要がある場合は、構造が使用されます。ユニオンは、型変換が必要なときに使用されます。