C 中union的應用剖析

2021-04-19 19:38:21 字數 3004 閱讀 9036

前言

一、在union中儲存物件

在c中union中可以儲存任意型別的內建資料型別,那麼在c++中union是否可以儲存物件呢?還是讓我們看乙個例子吧,這比任何言語都能說明問題,不是嗎?

#pragma warning(disable : 4786)

#include

using namespace std;

class testunion

;int data_;

};typedef union _tagutype_

ut;int main (void)

class testunion

; 二、類中union的初始化

#pragma warning(disable : 4786)

#include

using namespace std;

class testunion

;union

data_;

storetype stype_;

testunion(testunion&);

testunion& operator=(const testunion&);

public:

testunion(const char* ch);

testunion(long l);

operator const char*() const

operator long() const

};testunion::testunion(const char* ch):data_.ch_(ch),stype_(const_charp)

testunion::testunion(long l):data_.l_(l),stype_(long)

int main (void)

真是不幸,編譯都通不過,好象沒有什麼問題呀,為什麼呢?data_.ch_(ch)和data_.l_(l)有問題嗎?如果你問乙個c程式設計師他會告訴你,絕對沒問題。你不會去懷疑編譯器有問題吧!不好意思!我一開始就是這麼想的,真是慚愧。費解,迷惑。讓我們來看看構造testunion物件時發生了什麼,這樣你就會明白了。當建立testunion物件時,自然要呼叫其相應的建構函式,在建構函式中當然要呼叫其成員的建構函式,所以其要去呼叫union成員的建構函式,但是其為匿名的,有沒有建構函式可呼叫,所以出錯。很明顯在c++中union和class一樣它可以有建構函式,不能如此直接引用其成員。struct同樣有這限制。只要我們給其定義乙個建構函式什麼問題都解決了。示例如下:

class testunion

;union dataunion //不能匿名

data_;

storetype stype_;

testunion(testunion&);

testunion& operator=(const testunion&);

public:

testunion(const char* ch);

testunion(long l);

operator const char*() const

operator long() const

};testunion::test

union(const char* ch):data_(ch),stype_(const_charp)

testunion::testunion(long l):data_(l),stype_(long)

testunion::dataunion::dataunion(const char* ch):ch_(ch)

testunion::dataunion::dataunion(long l):l_(l)

;struct

...;

;;這樣我們既可以根據具體的含義來訪問變數,也可以象陣列一樣的loop;

壓縮:compression

......;

struct

...;

;;這樣對於集中處理的情況,比如==,就會大幅度提高效率,象在64位機上,只要一次,或者傳輸資料的情況,壓縮解壓縮都非常方便;

危險:匿名的union用法,不是standard,所以在compiler上要確認==>編譯器移植性不好;

不同的機器作業系統上資料的size都是不一樣,表示不一樣,那麼在用union的時候,尤其是在移植的時候,都是危險的情況;

但是如果系統,compiler都是一樣的話,在合適的地方使用union還是可以的。

C 中union的應用剖析

前言 熟悉c的程式設計師都知道union 聯合體 的用法,利用union可以用相同的儲存空間儲存不同型別的資料型別,從而節省記憶體空間。當訪問其內成員時可用 和 來直接訪問。在c 出現後,它繼承了union並保留了其在c中的特性。但是在c 中的union又有了新的擴充套件,這需要大家了解,要不然你會...

C 中union的應用剖析

前言 熟悉c的程式設計師都知道union 聯合體 的用法,利用union可以用相同的儲存空間儲存不同型別的資料型別,從而節省記憶體空間。當訪問其內成員時可用 和 來直接訪問。在c 出現後,它繼承了union並保留了其在c中的特性。但是在c 中的union又有了新的擴充套件,這需要大家了解,要不然你會...

C 中union的使用

聯合 union 在c c 裡面見得並不多,但是在一些對記憶體要求特別嚴格的地方,聯合又是頻繁出現,那麼究竟什麼是聯合 怎麼去用 有什麼需要注意的地方呢?就這些問題,我試著做一些簡單的回答,裡面肯定還有不當的地方,歡迎指出!1 什麼是聯合?聯合 是一種特殊的類,也是一種構造型別的資料結構。在乙個 聯...