110 likes | 221 Views
Union: 一種節省空間的 Class. 井民全 Reference : C++ Primer 中文版 pp.658-664. Union. 為一種特殊的 class 資料成員在記憶體內的儲存方式 一個覆疊一個 每一個 member 都由相同的記憶體位址開始放置 一個 union 所需的記憶體, 必須容納 一個 最大的資料成員. 考慮一種狀況. int I = 0;. Type. ID. Assign. Constant. Semicolon. int. I. =. 0. ;. 同時,一個 token 只表示一種型態.
E N D
Union: 一種節省空間的 Class 井民全 Reference : C++ Primer 中文版 pp.658-664
Union • 為一種特殊的 class • 資料成員在記憶體內的儲存方式 一個覆疊一個 • 每一個member 都由相同的記憶體位址開始放置 • 一個 union 所需的記憶體, 必須容納一個最大的資料成員
考慮一種狀況 • int I = 0; Type ID Assign Constant Semicolon int I = 0 ; 同時,一個 token 只表示一種型態 • 希望用一個資料型態 Token 表示 • 當 Token 是 ID 值為 I • 當 Token 是 Constant 值為 0
表現多種資料型別的方式 • Class • 針對每種需要的 type,加入 data member • 每個 data member 都會佔記憶體空間 • Union • 每個 data member 只佔相同的記憶體空間
enum TokenKind { ID,Constant}; clss Token{ public: TokenKind tok; TokenValue val; }; 我們選擇 union union TokenValue { char _cval; // 對 ID int _ival; // 對 整數值(constant) char *_sval; // 對 字串 double _dval; // 對 浮點數(constant) }; 最大的級別為 _dval TokenValue 的大小== _dval 使用範例 // token type 的物件 TokenValue last_token; // 指向token物件的指標 TokenValue *pt=new TokenValue;
操作 union • 必須透過 dot 或 arrow 運算子存取 union members 物件變數的存取方式 last_token._ival=97; 指標變數的存取方式 char ch=pt->_cval; • Union member 亦可以宣告在 • public, protected, private 區段中
union TokenValue{ public: char _cval; … private: int priv; }; int main(){ TokenValue tp; tp._cval=‘\n’; // ok // error: main() 不能存取 private member // TokenValue::priv tp.priv=1024; }
定義union 的member function • 我們可以為 union 定義 • Member function,建構子,解構子 union TokenValue{ public: TokenValue(int ix): _ival(ix) { } TokenValue(char ch) : _cval(ch) { } // … int ival() { return _ival; } char cval() { return _cval;} private: int _ival; char _cval; }; constructor Member funtion int main(){ TokenValue tp(10); int ix=tp.ival(); }
定義union • 若不使用union所定義的 type,則可以把name 拿掉 enum TokenKind { ID, Constant}; class Token{ public: TokenKind tok; union { char _cval; int _ival; char *_sval; double _dval; } val ; }; 定義 token 種類 的部分 定義 token value 的部分
Anonymous union • 沒有名稱的 union class Token{ public: TokenKind tok; // anonymous union union { char _cval; int _ival; char *_sval; double _dval; }; }; 在 union 所在的scope中,可以直接存取 該data member AnonymousUnionDemo.dsw
一些union 的限制 • Union 不可以擁有 • static data member • reference data member • class 成員,其中該類別包含 • 建構子, 解構子或 copy assignment 運算子 … operator=(…) union illegal_members{ Screen s; // error: has constructor Screen *ps; // ok: it’s a pointer static int is; // error: static member int &rf; // error: reference member };