联合 union

union是一个特殊的类

  • 具备类的一些特征,如:函数

    • 能够使用 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用于声明一个未命名的联合时,更像是一个动词,表示定义若干个变量,并且让这些变量具备相同的起始地址.如:

    • 因此能够理解'匿名联合的成员的名字出如今定义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修饰.见上.多是用来强调未命名的联合不对其余文件具备可见性. 

相关文章
相关标签/搜索