1 / 21

Chapter 9

Chapter 9. 類別. 目標. 類別解構子 (Destructor) 如何實作 如何配置記及釋放記憶體給類別的資料成員 撰寫拷貝建構子的時機 何謂組合 (union) 如何讓 C++ 運算子適用於類別物件 何謂類別樣板 (Class Template) 實際運用類別. 類別解構子 (Destructors). free store 提供配置類別成員的記憶體 , 只能由解構子和建構子來管理 解構子是一個函式 - 當物件不再被需要或超出範圍 , 解構子會將物件消滅 ( 靜態成員除外 ) 解構子是一個成員函式 名稱與類別名稱相同 解構子前須加上 ~

dena
Download Presentation

Chapter 9

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. Chapter 9 類別

  2. 目標 • 類別解構子(Destructor) • 如何實作 • 如何配置記及釋放記憶體給類別的資料成員 • 撰寫拷貝建構子的時機 • 何謂組合(union) • 如何讓C++運算子適用於類別物件 • 何謂類別樣板(Class Template) • 實際運用類別

  3. 類別解構子 (Destructors) • free store提供配置類別成員的記憶體, 只能由解構子和建構子來管理 • 解構子是一個函式-當物件不再被需要或超出範圍, 解構子會將物件消滅(靜態成員除外) • 解構子是一個成員函式 • 名稱與類別名稱相同 • 解構子前須加上~ • 不能傳回任何值, 也不能有任何參數

  4. Example • ~CBox(); • 指定解構子的傳回質或參數都是不合法的

  5. 內定解構子 • 內定解構子(Default Destructor)-自動執行物件的銷毀 • 由new動態配制給物件或物件成員的記憶體空間, 無法以內定解構子釋放 • 需使用delete • Ex9_01.cpp • 程式結束時, 所有存在的物件都將呼叫解構子

  6. 解構子與動態配置記憶體 • 在建構子中使用new • Ex:p326 • 解構子利用del釋放

  7. Example • CMessage motto(“A miss is as good as a mile.”); • CMessage* pM=new CMessage(“A cat can look at a queen.”); • See p328 • 需使用del pM;釋放

  8. 實作拷貝建構子 • CMessage motto1(“Radiation fades your genes.”); • CMessage metto2(motto1); • 兩者分享同一字串 • 問題: 一物件改變或銷毀, 會影響另一個 • 解決: 自行提供拷貝建構子取代內定建構子

  9. 自定拷貝建構子 CMessage(const CMessage& initM) { pmessage=new char[strlen(initM.pmessage)+1]; strcpy(pmessage, initM.pmessage); } 使用動態配置記憶體給類別成員時, 一定要用自定拷貝建構子

  10. 變數間分享記憶體 • union • A, B 共用記憶體? • 程式需很大資料陣列, 事先不知資料型態 • 需要以多種方式解釋一個資料 • or 將數值資料當字串來搬動 • 傳遞物件或資料事先不知型態

  11. 定義union • 使用關鍵字union union shareLD { double dval; long lval; };

  12. 說明 • 定義union型態—shareLD • 使long and double佔用相同記憶體位址 • union型態名稱, 被視為標籤名稱tag name • 類似類別定義

  13. 使用union • shareLD myUnion; • 宣告一union的shareLD型態的實體-myUnion • 變數宣告也可以在union定義中 union shareLD { double dval; long lval; }myUnion;

  14. 使用union成員 • myUnion.lval=100; • 宣告union實體時, 只能將union對第一個成員初始化

  15. 多個變數共享記憶體 • union所佔記憶體由最大成員所需空間決定 union shareDLF { double dval; long lval; float fval; } unist={1.5};

  16. 不記名union • 可定義一union沒有union型態名稱 • 動態宣告一union實體 union { char* pval; double dval; long lval; }; dval =99.5;

  17. 類別中的union • 類別也可以包含union實體 • 需使用一個類別成員作為指示器, 分辨union所儲存值的型態 • 不常用

  18. 覆載運算子 • 允許將標準運算子, 針對自定資料型態的物件進行動作 • 不允許發明新運算子 • 不能改變運算子優先順序 • 並非所有運算子皆可覆載

  19. 不能覆載的運算子種類 • 範圍解析運算子:: • 條件運算子:? • 直接成員選擇運算子. • size-of運算子sizeof • 類別成員的非參考指標運算子.*

  20. 實作覆載運算子 Class CBox { Public: Bool operator>(CBox& aBox) const; };

  21. 說明 • 使用關鍵字operator • operator>被定義成一個運算子函式 • 與new 及delete配合時, 關鍵字與運算子名稱須留空格

More Related