Unionコモン宣言とコモン変数定義

2414 ワード

1.共用体宣言と共用体変数定義共用体(「共用体」百科事典参照)は、キーワードunionを使用して定義される特殊な形式の変数である
共通体(連合とも呼ばれる)宣言と共通体変数の定義は、構造体とよく似ています.形式は次のとおりです.
ユニオン共用体名{
データ型メンバー名;
データ型メンバー名;
...
}変数名;
共通体は、いくつかの変数が1つのメモリ位置を共有し、異なる時間に異なるデータ型と異なる長さの変数を保存することを示します.Unionでは、すべての共通体メンバーが1つの空間を共有し、同じ時間に1つのメンバー変数の値しか格納できません.
次の例では、共通体fooを宣言します.
union foo{/*“  ”  “FOO”*/
int i;/*“  ”  “i”*/
char c;/*“  ”  “C”*/
double k;/*“ ”    “K”*/
};
 
   
再用已声明的共用体可定义共用体变量。
例如用上面说明的共用体定义一个名为bar的共用体变量, 可写成:
union foo bar;
在共用体变量bar中, 整型变量i和字符变量c共用同一内存位置。
当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。以上例而言,最大长度是double数据类型,所以foo的内存空间就是double型的长度。
union foo/*“  ”  “FOO”*/
{
char s[10];/*“  ”     “S”   “10”   */
int i;/*“  ”  i*/
};
 
    
   
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
它的内存大小与struct的类似,可以参考一下。
由于union的数据成员共用一个内存空间,所以必须存取正确的成员才能正确的读取变量值,可以使用一个额外的变数或列举型态来记录最后一次使用空间的是哪个成员,例如:
#include 
using namespace std;
union StateMachine {
public:
char character;
int number;
char *str;
StateMachine(char c) {
character = c;
}
StateMachine(int n) {
number = n;
}
StateMachine(char* s) {
str = s;
}
};
enum State {character, number, str};
int main() {
State state = character;
StateMachine machine('J');
...
if(state == character)
cout << machine.character << endl;
...
return 0;
}

また、unionのメンバーは静的、参照であってはならず、カスタム型の場合、このカスタム型のメンバーは、コンストラクション式、解構式、または指定された演算子をコピーしてはならないことに注意してください.
2.共用体と構造体の違い
共用体と構造体には以下の違いがあります.
1.共通体および構造体は、複数の異なるデータ型メンバーで構成されているが、同じ時点においても、共通体は選択されたメンバーを1つだけ保持し、構造体のすべてのメンバーが存在する.
2.共有体の異なるメンバーに対して値を割り当てると、他のメンバーに対して書き換えられ、元のメンバーの値は存在せず、構造体の異なるメンバーに対して値を割り当てることは互いに影響しません.