具備類的一些特徵,如:函數
能夠使用 public,private,protected 來限定成員的可見性.spa
能夠具備 數據成員,函數成員,類型成員 .如:code
union Class{ private: int _s;/* 數據成員 */ public: typedef int value_type;/* 類型成員 */ public: Class(); Class(int); Class(const Class&); void test(); };
同時不具備類的以下特徵:繼承
不能夠出現繼承層次中,即不能夠用做基類,也不能夠繼承其餘的類.作用域
成員函數不能夠爲虛函數,由於union不能夠出如今繼承層次中.io
數據成員不能夠是以下類型:class
不能夠是靜態類型,test
不能夠是引用類型.變量
不能具備定義了構造函數,析構函數,賦值操做符的類類型成員;該限制包括了具備帶構造函數,析構函數,賦值操做符的成員的類.命名空間
union的特殊之處: union中的數據成員具備相同的起始地址,因此同一時刻只有一個成員的值具備意義.
當union用於聲明一個未命名的聯合時,更像是一個動詞,表示定義若干個變量,並且讓這些變量具備相同的起始地址.如:
因此能夠理解'匿名聯合的成員的名字出如今定義union的做用域中'.
static union{ int _i; float _j; }; /** * 至關於: int _i;float _j;只不過union限定了_i,_j具備相同的起始地址. * 注意未命名union中的名字出如今定義union的做用域中.因此_i,_j就像在全局做用域中直接定義同樣. */ int main( int argc,char *argv[] ){ ::_i =33; /* _i至關於直接在全局做用域中定義同樣,_i定義在全局命名空間中 */ printf("%d\t%f\n",_i,_j); _j =3.3; printf("%d\t%f\n",_i,_j); }
class X{ int _i; union{ int _j; float _f; }; }; /** * 至關於: * class X{ * int _i; * int _j; * float _f; * }; * 只不過 _j,_f 具備相同的起始地址. */
#define Union(x) union{ x }; int main(int argc,char *argv[]){ Union(int i;float j;); /** 至關於在 main() 造成的局部做用域中定義了 int i;float j; 只不過 i,j 具備相同的起始地址. */ j=33; printf("%d\t%f",i,j); }
當union做爲一個未命名聯合出如今全局做用域時,應該使用static修飾.見上.多是用來強調未命名的聯合不對其餘文件具備可見性.