前言
熟悉c的程式設計師都知道union(聯合體)的用法,利用union可以用相同的儲存空間儲存不同型別的資料型別,從而節省記憶體空間。當訪問其內成員時可用"."和"->"來直接訪問。在c++出現後,它繼承了union並保留了其在c中的特性。但是在c++中的union又有了新的擴充套件,這需要大家了解,要不然你會感到費解和迷惑。下面我講兩點。
一、在union中儲存物件
在c中union中可以儲存任意型別的內建資料型別,那麼在c++中union是否可以儲存物件呢?還是讓我們看乙個例子吧,這比任何言語都能說明問題,不是嗎?
這樣不行,union中不可以儲存testunion類的物件,但在c中union可以儲存struct呀,為什麼不能儲存類的物件呢?很簡單,請問,在c中union可以儲存帶有建構函式的struct嗎?對了,在c中的struct是沒有建構函式的,所以如果c++中union可以儲存有建構函式的類的物件就不太符合邏輯,那不是說c++和c完全相容嗎?不錯,正因為這一點,c++中union不可以儲存有建構函式的類的物件,但是可以儲存不帶建構函式的類的物件,這樣就和c保持一致了,不想信你試試。對testunion類的宣告進行如下修改:
再進行編譯,一切ok!。但是這樣卻失去了c++的構造初始化特性,這樣做是沒有任何意義的,我只是在說其在c++中的語義,並不是推薦大家使用(絕對不推薦)。但是我們可以在union中儲存物件的指標,從而引用不同的物件型別。不用我再多說了吧,大家還是試試吧!
二、類中union的初始化
由於union的共享記憶體特點,我們可以使我們的類儲存不同的型別而不浪費記憶體空間,在類中我們可以宣告乙個union儲存不同型別的指標,示例如下:
真是不幸,編譯都通不過,好象沒有什麼問題呀,為什麼呢?data_.ch_(ch)和data_.l_(l)有問題嗎?如果你問乙個c程式設計師他會告訴你,絕對沒問題。你不會去懷疑編譯器有問題吧!不好意思!我一開始就是這麼想的,真是慚愧。費解,迷惑。讓我們來看看構造testunion物件時發生了什麼,這樣你就會明白了。當建立testunion物件時,自然要呼叫其相應的建構函式,在建構函式中當然要呼叫其成員的建構函式,所以其要去呼叫union成員的建構函式,但是其為匿名的,有沒有建構函式可呼叫,所以出錯。很明顯在c++中union和class一樣它可以有建構函式,不能如此直接引用其成員。struct同樣有這限制。只要我們給其定義乙個建構函式什麼問題都解決了。示例如下:
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 什麼是聯合?聯合 是一種特殊的類,也是一種構造型別的資料結構。在乙個 聯...