210 likes | 329 Views
Chapter 9. 類別. 目標. 類別解構子 (Destructor) 如何實作 如何配置記及釋放記憶體給類別的資料成員 撰寫拷貝建構子的時機 何謂組合 (union) 如何讓 C++ 運算子適用於類別物件 何謂類別樣板 (Class Template) 實際運用類別. 類別解構子 (Destructors). free store 提供配置類別成員的記憶體 , 只能由解構子和建構子來管理 解構子是一個函式 - 當物件不再被需要或超出範圍 , 解構子會將物件消滅 ( 靜態成員除外 ) 解構子是一個成員函式 名稱與類別名稱相同 解構子前須加上 ~
E N D
Chapter 9 類別
目標 • 類別解構子(Destructor) • 如何實作 • 如何配置記及釋放記憶體給類別的資料成員 • 撰寫拷貝建構子的時機 • 何謂組合(union) • 如何讓C++運算子適用於類別物件 • 何謂類別樣板(Class Template) • 實際運用類別
類別解構子 (Destructors) • free store提供配置類別成員的記憶體, 只能由解構子和建構子來管理 • 解構子是一個函式-當物件不再被需要或超出範圍, 解構子會將物件消滅(靜態成員除外) • 解構子是一個成員函式 • 名稱與類別名稱相同 • 解構子前須加上~ • 不能傳回任何值, 也不能有任何參數
Example • ~CBox(); • 指定解構子的傳回質或參數都是不合法的
內定解構子 • 內定解構子(Default Destructor)-自動執行物件的銷毀 • 由new動態配制給物件或物件成員的記憶體空間, 無法以內定解構子釋放 • 需使用delete • Ex9_01.cpp • 程式結束時, 所有存在的物件都將呼叫解構子
解構子與動態配置記憶體 • 在建構子中使用new • Ex:p326 • 解構子利用del釋放
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;釋放
實作拷貝建構子 • CMessage motto1(“Radiation fades your genes.”); • CMessage metto2(motto1); • 兩者分享同一字串 • 問題: 一物件改變或銷毀, 會影響另一個 • 解決: 自行提供拷貝建構子取代內定建構子
自定拷貝建構子 CMessage(const CMessage& initM) { pmessage=new char[strlen(initM.pmessage)+1]; strcpy(pmessage, initM.pmessage); } 使用動態配置記憶體給類別成員時, 一定要用自定拷貝建構子
變數間分享記憶體 • union • A, B 共用記憶體? • 程式需很大資料陣列, 事先不知資料型態 • 需要以多種方式解釋一個資料 • or 將數值資料當字串來搬動 • 傳遞物件或資料事先不知型態
定義union • 使用關鍵字union union shareLD { double dval; long lval; };
說明 • 定義union型態—shareLD • 使long and double佔用相同記憶體位址 • union型態名稱, 被視為標籤名稱tag name • 類似類別定義
使用union • shareLD myUnion; • 宣告一union的shareLD型態的實體-myUnion • 變數宣告也可以在union定義中 union shareLD { double dval; long lval; }myUnion;
使用union成員 • myUnion.lval=100; • 宣告union實體時, 只能將union對第一個成員初始化
多個變數共享記憶體 • union所佔記憶體由最大成員所需空間決定 union shareDLF { double dval; long lval; float fval; } unist={1.5};
不記名union • 可定義一union沒有union型態名稱 • 動態宣告一union實體 union { char* pval; double dval; long lval; }; dval =99.5;
類別中的union • 類別也可以包含union實體 • 需使用一個類別成員作為指示器, 分辨union所儲存值的型態 • 不常用
覆載運算子 • 允許將標準運算子, 針對自定資料型態的物件進行動作 • 不允許發明新運算子 • 不能改變運算子優先順序 • 並非所有運算子皆可覆載
不能覆載的運算子種類 • 範圍解析運算子:: • 條件運算子:? • 直接成員選擇運算子. • size-of運算子sizeof • 類別成員的非參考指標運算子.*
實作覆載運算子 Class CBox { Public: Bool operator>(CBox& aBox) const; };
說明 • 使用關鍵字operator • operator>被定義成一個運算子函式 • 與new 及delete配合時, 關鍵字與運算子名稱須留空格