青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

對union的進一步認識與一些深層應用

雖然平時在程序開發時較少使用union,雖然當初學C語言時,union章被老師略過沒有介紹,雖然,自認為自己對union的認識已經足夠,但是,在寫完上一篇文章<(大衛的閱讀筆記)C++中使用union的幾點思考>之后,網上的討論驅使我對這一基本的語言特性又投入了一些精力去關注,并寫成了此文.

下面以MSDN中關于union的概述作為開頭,這好像有些無聊,不過,有時候看specification的東西可以給我們很多提示,當我們從應用的角度去關注一樣東西的時候,很多更深層次的考慮被我們忽略了.所以,看下去,里面有些東西可能正是你忽略了的.

union
union
[tag] { member-list } [declarators];

[
union] tag declarators;

The union keyword declares a union type and/or a variable of a union type.

A union is a user-defined data type that can hold values of different types at different times. It is similar to a structure
except that all of its members start at the same location in memory. A union variable can contain only one of its members at
a time. The size of the union is at least the size of the largest member(
大衛注:我想不出來大于的情況).

For related information, see class, struct, and Anonymous Union.

Declaring a Union

Begin the declaration of a union with the union keyword, and enclose the member list in curly braces:

union
UNKNOWN    // Declare union type
{
   char
   ch;
   int
    i;
   long
   l;
   float
  f;
   double
d;
}
var1;          // Optional declaration of union variable
Using a Union

A C++ union is a limited form of the class type. It can contain access specifiers (public, protected, private), member data,
and
member functions, including constructors and destructors. It cannot contain virtual functions or static data members. It
cannot be used as a base class, nor can it have base classes. Default access of members in a union is public.

A C union type can contain only data members.

In C, you must use the union keyword to declare a union variable. In C++, the union keyword is unnecessary:

Example 1

union
UNKNOWN var2;   // C declaration of a union variable
UNKNOWN var3;         // C++ declaration of a union variable
Example 2

A variable of a union type can hold one value of any type declared in the union. Use the member-selection operator (.) to access a member of a union:

var1.i = 6;           // Use variable as integer
var2.d = 5.327;       // Use variable as double

為了避免對上述文字有稍許的歪曲,我故意沒有翻譯它,但在此對其進行一些歸納:
1.
union是一種特殊的struct/class,是一種可用于容納多種類型的類型,但與struct/class不同的是,所有的成員變量共享同一存儲空間(最大的那一個成員類型的大小),這使得它具有多變的特性,可以在不同成員中任意切換,而無需借助強制類型轉換,但這也使得你不能把它當作一個成員變量進行修改而不影響到另一成員變量;
2.
union也可以有構造/析構函數,也可以包含訪問標識符,但不能包含虛函數或靜態成員變量/方法.

關于使用union時需要注意的一些問題,可以參考我的前一篇文章:<(大衛的閱讀筆記)C++中使用union的幾點思考>.
下面談談一些比較有意思并且有意義的union的應用.
1.
in_addr

struct
in_addr {
  union
{
          struct
{ u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;
          struct
{ u_short s_w1,s_w2; }            S_un_w;
          u_long                                   S_addr;
  }
S_un;
};


對于上面的struct,寫過socket應用的人,肯定都用過它.不知你注意過沒有,它包含了一個很有趣的union,union的各成員具有相同的大小,分別代表同一信息的不同表現形式.你在進行程序設計的時候也可以利用這一特性來提供同一信息的不同表現形式,不過要注意,在進行跨平臺應用時,字節順序的影響可能給你造成一些不必要的麻煩.

2.
匿名union
匿名union是沒有名稱和聲明列表的union,這跟'__unnamed' union不是一回事,它的聲明形式如下:
union
{ member-list } ;

匿名union僅僅通知編譯器它的成員變量共享一個地址,而變量本身是直接引用的,不使用通常的點號運算符語法.也正因此,匿名union與同一程序塊內的其它變量具有相同的作用域級別,需注意命名沖突.
請看下面的例子:

#include <iostream.h>

struct
DataForm
{

    enum
DataType { CharData = 1, IntData, StringData };
    DataType type;

    // Declare an anonymous union.
    union
    {

        char
  chCharMem;
        char
*szStrMem;
        int
   iIntMem;
    };

    void
print();
};


void
DataForm::print()
{

  
// Based on the type of the data, print the
    // appropriate data type.
    switch( type )
    {

    case
CharData:
        cout << chCharMem;
        break
;
    case
IntData:
        cout << szStrMem;
        break
;
    case
StringData:
        cout << iIntMem;
        break
;
    }
}


此外,匿名union還具有以下約束:
1
).因為匿名聯合不使用點運算符,所以包含在匿名聯合內的元素必須是數據,不允許有成員函數,也不能包含私有或受保護的成員;
2
).全局匿名聯合必須是靜態(static)的,否則就必須放在匿名名字空間中.

附注:
對匿名union的概念,你或許有些陌生,但對于Windows應用的開發人員,有一個經常用到的結構中就包含了匿名union,它就是VARIANT,也許你沒有注意它罷了:

typedef struct
FARSTRUCT tagVARIANT VARIANT;
typedef struct
FARSTRUCT tagVARIANT VARIANTARG;

typedef struct
tagVARIANT  {
   VARTYPE vt;
   unsigned short
wReserved1;
   unsigned short
wReserved2;
   unsigned short
wReserved3;
   union
{
      Byte                    bVal;                 // VT_UI1.
      Short                   iVal;                 // VT_I2.
      long                    lVal;                 // VT_I4.
      float                   fltVal;               // VT_R4.
      // ...
   };
};


3.
利用union進行類型轉換
前面已經說過,union具有多變的特性,可以在不同成員中任意切換,而無需借助強制類型轉換,下面舉例說明這一點(其實1已經很好地說明了這一點):

#include <iostream>
using namespace std;

struct
DATA
{

    char
c1;
    char
c2;
};


int
main()
{

    union
{ 
        int
i; 
        DATA data;
    }
_ut;
   
    _ut.i = 0x6162;

    cout << "_ut.data.c1 = " << _ut.data.c1 << endl
        <<
"_ut.data.c2 = " << _ut.data.c2 << endl;
   
    return
0;
}


需要提醒你的是,數據類型的轉換,并非union的專長,只是一個可資利用的特性而已.因為,采用union進行類型間轉換極易受平臺影響,如上面的程序采用Intel x86 + Windows 2000 + VC6時輸出為:
_ut.data.c1 = b
_ut.data.c2 = a
(
:因為Intel CPU的架構是Little Endian)
而在SunSparc,你得到的結果卻是:
_ut.data.c1 = 
_ut.data.c2 =
(
:因為采用Big Endian,前兩個字節為0x0000)

而即便是在同一平臺上,integer類型與real類型間進行轉換時也不要采用union,否則,你會得到令你莫名其妙的結論(這是由于CPUreal類型的處理方式引起的,該方式在各平臺上有極大區別,同時,根據C++ Standard,這種作法會引起"undefined behavior").

關于利用引用進行類型轉換,可參考<引用在強制類型轉化的應用>.

 

posted on 2004-11-26 10:16 大衛的思維空間 閱讀(3750) 評論(8)  編輯 收藏

# re: union的進一步認識與一些深層應用

我想不出來大于的情況
---
還有字節對齊的情況,和struct一樣

匿名union我經常使用,但我不知道它叫匿名union”,而且還可以放在外邊用,我去試試看,謝謝!

2004-11-26 22:07 | 周星星

# re: union的進一步認識與一些深層應用

你的文章寫的很好,總結得不錯

2005-05-05 13:34 | peak

# re: union的進一步認識與一些深層應用

union實際上是一個二進制容器,所以當程序中從不同的角度來解釋這個二進制數據的時候非常容易受各種實現細節的影響,尤其是涉及到這些二進制數據在不同平臺和編譯器之間交換的時候。

2005-10-29 00:51 | youngs

# re: union的進一步認識與一些深層應用

多謝文章。請教問題:union中的成員類型只能是基本的類型,不能使自己定義的類結構么? 比如說 CMyLine m_Ln?

2007-12-13 11:52 | cc

# re: union的進一步認識與一些深層應用

union既然可以包含struct,自然也是可以包含從class的,但是存在諸多限制,同時,很難想象你的應用需要在union中包含一個復雜class,如CStringSTLstring

2008-03-03 15:44 | 大衛的思維空間

 

 

posted on 2008-11-19 21:15 肥仔 閱讀(519) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            麻豆国产精品一区二区三区 | 99国产精品视频免费观看| 欧美高清影院| 欧美在线一区二区三区| 亚洲小说欧美另类婷婷| 夜夜嗨av一区二区三区中文字幕| 国内久久视频| 尤物99国产成人精品视频| 欧美成人亚洲成人| 亚洲福利久久| 久久精品国产第一区二区三区最新章节 | 久久躁狠狠躁夜夜爽| 欧美专区在线| 久久综合久色欧美综合狠狠 | 亚洲欧美在线一区二区| 亚洲一区一卡| 免费亚洲一区| 国产精品久久午夜| 国产一区日韩二区欧美三区| 国内视频一区| 一本综合精品| 99在线|亚洲一区二区| 亚洲影院色在线观看免费| 久久精品成人| 99在线|亚洲一区二区| 欧美一区在线直播| 欧美大片在线观看| 国产日韩视频| 亚洲欧美激情四射在线日| 欧美一区成人| 一本色道婷婷久久欧美| 欧美一级久久久久久久大片| 亚洲电影免费观看高清| 午夜激情久久久| 欧美激情一区三区| 亚洲高清在线观看一区| 久久综合中文字幕| 久久久噜久噜久久综合| 国产亚洲观看| 久久久久久久激情视频| 欧美伊人久久久久久午夜久久久久 | 国产精品二区二区三区| 亚洲电影网站| 亚洲国产美女| 欧美日韩国产影片| 午夜精品婷婷| 久久精品在线视频| 亚洲日本va午夜在线影院| 亚洲国产精品va| 欧美—级高清免费播放| 亚洲一区亚洲| 久久精品91久久香蕉加勒比 | 欧美日韩在线大尺度| 一区二区三区日韩| 一区二区欧美日韩| 影音先锋久久久| 日韩视频在线免费观看| 亚洲欧美资源在线| 国内揄拍国内精品久久| 亚洲国产另类 国产精品国产免费| 久久国产精品久久国产精品| 尤物在线精品| 亚洲尤物影院| 亚洲午夜一区| 美日韩丰满少妇在线观看| 亚洲一区二区黄| 免费的成人av| 欧美诱惑福利视频| 欧美久久久久久久久久| 欧美一区二区视频97| 欧美日本二区| 亚洲韩国一区二区三区| 激情欧美日韩一区| 午夜精品国产精品大乳美女| 一区二区日韩伦理片| 美女福利精品视频| 欧美成人久久| 亚洲狠狠丁香婷婷综合久久久| 性xx色xx综合久久久xx| 久久国产精品黑丝| 国产在线成人| 久久综合给合| 亚洲国产欧美日韩精品| 亚洲人体影院| 欧美三级小说| 中国亚洲黄色| 久久精品国产亚洲a| 国模套图日韩精品一区二区| 午夜精品久久久久久久男人的天堂 | aa日韩免费精品视频一| 亚洲肉体裸体xxxx137| 亚洲国产精品成人一区二区| 久久精品91久久香蕉加勒比| 久久尤物电影视频在线观看| ●精品国产综合乱码久久久久| 欧美国产视频在线| 亚洲欧美日本伦理| 亚洲电影免费观看高清| 欧美在线高清视频| 日韩午夜免费| 极品中文字幕一区| 欧美久久婷婷综合色| 欧美一区二区三区免费视| 亚洲国产精品一区二区久| 久久国产精品72免费观看| 日韩亚洲国产欧美| **性色生活片久久毛片| 国产日韩欧美综合一区| 欧美午夜不卡视频| 欧美激情bt| 女同性一区二区三区人了人一| 亚洲欧美视频一区二区三区| 最新日韩中文字幕| 亚洲国产精品成人精品| 嫩草国产精品入口| 久久影院午夜片一区| 老司机亚洲精品| 久久综合中文字幕| 免费黄网站欧美| 欧美成人一区二免费视频软件| 久久亚洲综合网| 欧美成人中文字幕在线| 欧美激情精品久久久| 亚洲国产精品一区二区www| 亚洲人成网站999久久久综合| 亚洲狠狠婷婷| 亚洲免费视频网站| 久久久高清一区二区三区| 久久久精品国产免费观看同学| 久久精品日韩欧美| 欧美激情一区二区三区四区| 麻豆精品一区二区综合av| 欧美成黄导航| 日韩亚洲不卡在线| 欧美在线视频一区| 欧美日韩精品在线| 国产在线国偷精品产拍免费yy| 揄拍成人国产精品视频| 亚洲色图制服丝袜| 久久男女视频| 国产精品99久久久久久久女警| 亚洲欧美中文字幕| 欧美日韩在线大尺度| 亚洲成人在线视频网站| 国产精品久久久久三级| 久久国产天堂福利天堂| 国产精品一区二区在线观看不卡| 久久精品人人做人人爽电影蜜月| 老色鬼久久亚洲一区二区 | 午夜精品一区二区三区在线| 久久影视精品| 老色鬼久久亚洲一区二区| 国产精品乱码一区二三区小蝌蚪| 在线电影国产精品| 久久精品视频在线看| 亚洲欧美精品| 韩国成人福利片在线播放| 欧美淫片网站| 亚洲色诱最新| 国产精品影视天天线| 欧美在线视频免费播放| 亚洲欧美另类国产| 国产一区在线免费观看| 久久国产精品99久久久久久老狼| 亚洲免费视频在线观看| 黑人中文字幕一区二区三区| 久久天天躁夜夜躁狠狠躁2022| 欧美专区在线观看| 亚洲高清不卡av| 亚洲精品三级| 国内精品美女av在线播放| 欧美成人免费va影院高清| 亚洲黄网站在线观看| 亚洲欧美区自拍先锋| 国产一区二区中文字幕免费看| 快射av在线播放一区| 欧美激情一区二区在线 | 狠狠色噜噜狠狠狠狠色吗综合| 久久不见久久见免费视频1| 欧美va天堂在线| 久久久久网站| 欧美午夜电影在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美日韩亚洲成人| 欧美激情第8页| 激情久久久久| 夜夜嗨av一区二区三区网页| 亚洲国产清纯| 久久久久国产精品厨房| 午夜欧美不卡精品aaaaa| 欧美—级高清免费播放| 亚洲大胆视频| 亚洲精品久久久久中文字幕欢迎你| 一区二区三区免费网站| 亚洲免费高清| 欧美日韩一区二区国产| 日韩视频―中文字幕| 亚洲欧美日韩精品在线| 国产农村妇女毛片精品久久麻豆| 亚洲影院免费观看|