1 / 11

Union: 一種節省空間的 Class

Union: 一種節省空間的 Class. 井民全 Reference : C++ Primer 中文版 pp.658-664. Union. 為一種特殊的 class 資料成員在記憶體內的儲存方式  一個覆疊一個 每一個 member 都由相同的記憶體位址開始放置 一個 union 所需的記憶體, 必須容納 一個 最大的資料成員. 考慮一種狀況. int I = 0;. Type. ID. Assign. Constant. Semicolon. int. I. =. 0. ;. 同時,一個 token 只表示一種型態.

nasya
Download Presentation

Union: 一種節省空間的 Class

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Union: 一種節省空間的 Class 井民全 Reference : C++ Primer 中文版 pp.658-664

  2. Union • 為一種特殊的 class • 資料成員在記憶體內的儲存方式 一個覆疊一個 • 每一個member 都由相同的記憶體位址開始放置 • 一個 union 所需的記憶體, 必須容納一個最大的資料成員

  3. 考慮一種狀況 • int I = 0; Type ID Assign Constant Semicolon int I = 0 ; 同時,一個 token 只表示一種型態 • 希望用一個資料型態 Token 表示 • 當 Token 是 ID  值為 I • 當 Token 是 Constant  值為 0

  4. 表現多種資料型別的方式 • Class • 針對每種需要的 type,加入 data member • 每個 data member 都會佔記憶體空間 • Union • 每個 data member 只佔相同的記憶體空間

  5. 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;

  6. 操作 union • 必須透過 dot 或 arrow 運算子存取 union members 物件變數的存取方式 last_token._ival=97; 指標變數的存取方式 char ch=pt->_cval; • Union member 亦可以宣告在 • public, protected, private 區段中

  7. 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; }

  8. 定義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(); }

  9. 定義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 的部分

  10. 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

  11. 一些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 };

More Related