C++Unionの概要


コンビネーション(union)はC/C++の中では多くないように見えますが、メモリに対する要求が特に厳しいところでは、コンビネーションが頻繁に現れています.では、コンビネーションとは何なのか、どのように使うのか、注意すべきところは何なのでしょうか.これらの質問について、簡単な答えをしてみましたが、中には間違いなく不適切なところがあります.指摘を歓迎します.
1、連合とは何ですか.「結合」は特殊なクラスであり、構造タイプのデータ構造でもあります.1つの「結合」では、複数の異なるデータ型を定義できます.1つの「結合」タイプとして説明される変数では、同じセグメントのメモリを共有する「結合」で定義された任意のデータを読み込むことができます.スペースを節約する目的を達成しました(スペースを節約するタイプ:ビットドメインもあります).これは非常に特殊な場所であり、連合の特徴でもあります.またstructと同様に、連合デフォルトのアクセス権も共通であり、メンバー関数もあります.
2、連合と構造の違い?
「結合」と「構造」にはいくつかの類似点があります.しかし、両者には本質的な違いがある.構造内の各メンバーにはそれぞれのメモリ領域があり、構造変数の合計長さは、メンバーの長さの合計です(空の構造を除き、境界調整は考慮されません).で、各メンバーはメモリ領域を共有し、結合変数の長さは各メンバーの最長の長さに等しい.なお、ここで共有とは、複数のメンバを同時に1つの連合変数に組み込むことではなく、その連合変数に任意のメンバ値を付与することができるが、毎回1つの値しか付与できず、新しい値を付与すると古い値が消去されることを意味する.
#include 
void main()
{
	union number
	{ /*      */
		int i;
		struct
		{ /*          */
			char first;
			char second;
		}half;
	}num;
	num.i=0x4241; /*      */
	printf("%c%c/n", num.half.first, num.half.second);
	num.half.first='a'; /*         */
	num.half.second='b';
	printf("%x/n", num.i);
	getchar();
}
出力結果:
AB 
6261
上記の例の結果から、iに値を割り当てると、8ビット低いfirstとsecondの値が得られる.firstとsecondに文字を割り当てると、この2つの文字のASCIIコードもiの低8ビットと高8ビットとします.
3、どのように定義しますか.
例:
union test
{
	int office;
	char teacher[5];
};
はtestという名前の連合タイプを定義し、2つのメンバー、1つは整数、メンバー名officeを含む.もう1つは文字配列で、配列名はteacherです.連合定義後、連合変数の説明が行われ、testタイプの変数として説明され、整数officeまたは文字配列teacherを格納することができる.
4、どのように説明しますか.連合変数の説明には、定義してから説明し、定義して同時に説明し、直接説明する3つの形式があります.
testタイプを例にとると、以下のように説明されます.
union test
{
	int office;
	char teacher[5];
}; 
union test a,b; /*  a,b test  */
union test
{
	int office;
	char teacher[5];
} a,b;
union 
{
	int office;
	char teacher[5];
} a,b;

のa,b はいずれもtestタイプである.a,b の さはtestのメンバーの で も い さ、すなわちteacher の さに しい5バイトであるべきである.a,b は, を する ,4バイトのみを い, を する は5バイトを いる.
 
5、どのように いますか. に する は、 のメンバーに してのみ できます. のメンバーは、 として す.メンバー は、 えば、aがtestタイプの として された 、a.class、a.officeを して、 の のみで を したり、 の を したりすることはできません.また、 を して を することはできません. はプログラムでのみ できます.また、 は、 1つのメンバー しか えられないことを します.すなわち、1つの の は、 のメンバー である.