聯合 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修飾.見上.多是用來強調未命名的聯合不對其餘文件具備可見性. 

相關文章
相關標籤/搜索