具备类的一些特征,如:函数
能够使用 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修饰.见上.多是用来强调未命名的联合不对其余文件具备可见性.