C 中union的應用剖析

2021-04-01 02:16:43 字數 2572 閱讀 7674

前言

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

一、在union中儲存物件

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

#pragma warning(disable : 4786)

#include

using namespace std;

class testunion

;int data_;

};typedef union _tagutype_

ut;int main (void)

這樣不行,union中不可以儲存testunion類的物件,但在c中union可以儲存struct呀,為什麼不能儲存類的物件呢?很簡單,請問,在c中union可以儲存帶有建構函式的struct嗎?對了,在c中的struct是沒有建構函式的。所以如果c++中union可以儲存有建構函式的類的物件就不太符合邏輯,那不是說c++和c完全相容嗎?不錯,正因為這一點,c++中union不可以儲存有建構函式的類的物件,但是可以儲存不帶建構函式的類的物件,這樣就和c保持一致了,不想信你試試。對testunion類的宣告進行如下修改:

class testunion

; 再進行編譯,一切ok!。但是這樣卻失去了c++的構造初始化特性,這樣做是沒有任何意義的,我只是在說其在c++中的語義,並不是推薦大家使用(絕對不推薦)。但是我們可以在union中儲存物件的指標,從而引用不同的物件型別。不用我再多說了吧,大家還是試試吧!

二、類中union的初始化

由於union的共享記憶體特點,我們可以使我們的類儲存不同的型別而不浪費記憶體空間,在類中我們可以宣告乙個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::testunion(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)

現在再編譯,如果還不行,你懷疑編譯器有問題是有理由的。好了就寫這麼多吧!希望對大家有幫助,我可是花了乙個下午的時間呀!如果有什麼錯誤,希望來信指出,很希望和大家共同**c++,共同進步(ccplusplus@21**.***)。

C 中union的應用剖析

前言 一 在union中儲存物件 在c中union中可以儲存任意型別的內建資料型別,那麼在c 中union是否可以儲存物件呢?還是讓我們看乙個例子吧,這比任何言語都能說明問題,不是嗎?pragma warning disable 4786 include using namespace std cl...

C 中union的應用剖析

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

C 中union的使用

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