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

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>
            久久亚洲视频| 91久久精品国产91性色tv| 久久理论片午夜琪琪电影网| 欧美中文在线观看国产| 久久精品免费播放| 老色鬼久久亚洲一区二区| 欧美精品自拍| 国产精品久久久久免费a∨| 国产欧美一区二区精品性色| 国产日韩精品视频一区| 亚洲成人在线网站| 亚洲天堂久久| 久久一区二区三区超碰国产精品| 米奇777超碰欧美日韩亚洲| 亚洲国产成人精品久久| 亚洲另类在线视频| 欧美亚洲综合在线| 欧美人成在线视频| 国产免费观看久久黄| 亚洲高清中文字幕| 亚洲欧美精品一区| 欧美h视频在线| 亚洲午夜视频在线| 欧美精品在线一区二区三区| 国产一区免费视频| 99视频国产精品免费观看| 久久高清国产| 一区二区三区四区蜜桃| 久久综合伊人77777| 国产亚洲精品成人av久久ww| 日韩一区二区精品| 欧美成人免费全部| 欧美在线观看视频一区二区三区| 欧美日韩久久久久久| 亚洲国产精品女人久久久| 久久精品日韩| 亚洲一区久久| 欧美日韩在线亚洲一区蜜芽| 91久久精品美女| 免费不卡在线观看| 午夜精品久久久久久久久久久久| 欧美精品成人| 亚洲美女av网站| 欧美激情亚洲自拍| 久久亚洲综合色| 在线成人激情视频| 美女网站久久| 久久久www免费人成黑人精品| 99精品国产在热久久婷婷| 一本一本大道香蕉久在线精品| 欧美一区二区三区四区高清| 亚洲精品少妇30p| 鲁鲁狠狠狠7777一区二区| 狠狠综合久久| 另类图片综合电影| 久久久国产精品一区二区中文| 国产日韩欧美二区| 午夜精品在线看| 亚洲欧美精品在线| 国产婷婷97碰碰久久人人蜜臀| 午夜日韩视频| 久久福利资源站| 亚洲电影毛片| 亚洲破处大片| 欧美四级伦理在线| 欧美亚洲视频| 欧美一级在线亚洲天堂| 韩国av一区二区| 欧美黄在线观看| 欧美精品一区二区三| 亚洲影视在线| 欧美尤物巨大精品爽| 在线观看欧美亚洲| 亚洲精品影院在线观看| 国产精品久久777777毛茸茸| 欧美在线免费观看亚洲| 久久成人羞羞网站| 日韩一区二区久久| 午夜久久黄色| 亚洲麻豆av| 欧美一级黄色录像| 亚洲日本aⅴ片在线观看香蕉| 亚洲片在线资源| 国产欧美日韩综合一区在线观看| 久久综合图片| 欧美色网一区二区| 六月婷婷久久| 欧美日韩三级电影在线| 欧美专区在线播放| 欧美高清在线播放| 性伦欧美刺激片在线观看| 久久久在线视频| 亚洲一级在线| 久久午夜精品一区二区| 亚洲一区二区在线免费观看视频| 欧美专区亚洲专区| 亚洲天堂久久| 久久午夜视频| 久久精品国产999大香线蕉| 欧美成人性网| 久久亚洲不卡| 国产精品都在这里| 欧美电影资源| 国产美女诱惑一区二区| 亚洲人成免费| 免费观看成人| 亚洲国产精品va在看黑人| 一卡二卡3卡四卡高清精品视频| 伊人精品成人久久综合软件| 亚洲视频精选在线| 日韩一级成人av| 久久在线免费观看视频| 欧美午夜性色大片在线观看| 日韩小视频在线观看| 欧美影院在线| 亚洲制服av| 欧美韩国在线| 免费视频一区二区三区在线观看| 国产精品三上| 亚洲视频久久| 亚洲视频香蕉人妖| 欧美激情一区二区三区在线视频 | 久久国产婷婷国产香蕉| 亚洲一区视频在线观看视频| 欧美激情精品久久久久久蜜臀 | 欧美片第一页| 欧美成人免费在线| 影音先锋另类| 久久久久国产免费免费| 久久精品亚洲一区二区| 国产精品欧美精品| 亚洲视频大全| 亚洲欧美综合| 国产女同一区二区| 欧美一区影院| 久久亚洲综合| 精品成人国产在线观看男人呻吟| 小处雏高清一区二区三区| 香蕉久久久久久久av网站| 国产精品扒开腿做爽爽爽软件| 亚洲欧洲精品一区二区三区不卡 | 一区二区三区成人| 亚洲一区中文字幕在线观看| 欧美偷拍一区二区| 亚洲午夜激情网页| 久久精品道一区二区三区| 国产亚洲激情视频在线| 久久精品99国产精品日本| 久久午夜精品一区二区| 亚洲国产欧洲综合997久久| 欧美freesex交免费视频| 亚洲三级电影全部在线观看高清| 99视频在线精品国自产拍免费观看 | 午夜视频在线观看一区二区三区| 国产精品久久久久久久久| 亚洲一区精彩视频| 美女脱光内衣内裤视频久久影院| 亚洲高清资源| 欧美日韩在线影院| 午夜一区不卡| 欧美插天视频在线播放| 亚洲调教视频在线观看| 麻豆国产精品777777在线| 亚洲国产一区二区a毛片| 欧美另类99xxxxx| 亚洲综合清纯丝袜自拍| 媚黑女一区二区| 亚洲视频国产视频| 国产一区二区三区久久久| 久久这里只有| 亚洲视频在线观看三级| 久久夜色精品亚洲噜噜国产mv| 91久久中文字幕| 欧美午夜精品一区| 久久嫩草精品久久久精品| 夜夜嗨av一区二区三区四区| 久久久免费精品| 夜夜躁日日躁狠狠久久88av| 国产日韩欧美在线播放| 欧美精品激情| 久久久久久穴| 亚洲欧美激情一区| 日韩天天综合| 亚洲第一福利在线观看| 久久久久国产精品厨房| 亚洲一区二区三区影院| 亚洲欧洲日本在线| 国模精品一区二区三区色天香| 欧美日韩在线播放一区| 免费av成人在线| 久久av一区二区三区漫画| 一区二区三区四区精品| 亚洲激情网站免费观看| 另类天堂av| 久久久噜噜噜| 久久精品亚洲一区二区三区浴池 | 一区二区三区精密机械公司| 亚洲第一网站免费视频| 国产一区二区三区久久悠悠色av| 国产精品99免费看 |