23
類類類類 Class Template 類類類類類類 類類類類類類類類類類類類類類類類類類(instance) 類類類類類類類 instantiating

類別樣板 Class Template

  • Upload
    carys

  • View
    51

  • Download
    0

Embed Size (px)

DESCRIPTION

類別樣板 Class Template. 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體 (instance) 此建立過程稱為 instantiating. template Class Cexample { T m_value; }. Class Cexample { int m_value; } Class Cexample { CBox m_value; }. Example. T 是一個變數用來設定型態 , 根據不同型態建立新類別. 定義類別樣板 p350. 說明. 參數 T 是變數型態 - PowerPoint PPT Presentation

Citation preview

Page 1: 類別樣板  Class Template

類別樣板 Class Template

類似函式樣板 由類別樣板產生的類別稱為類別樣版的實

體 (instance) 此建立過程稱為 instantiating

Page 2: 類別樣板  Class Template

Example

template <class T>

Class Cexample

{

T m_value;

}

Class Cexample

{

int m_value;

}

Class Cexample

{

CBox m_value;

}T 是一個變數用來設定型態 , 根據不同型態建立新類別

Page 3: 類別樣板  Class Template

定義類別樣板 p350

Page 4: 類別樣板  Class Template

說明 參數 T 是變數型態 宣到類別物件時 , T 會被指定的型態取代

Page 5: 類別樣板  Class Template

樣版的成員函式 如何放在定義外 template <class T>

T Csamples<T>::Max() const

{

T theMax = m_Values[0];

for (int i=1; i<m_Free, i++)

if….

}

用來辨別函式屬於哪個樣版

所產生

Page 6: 類別樣板  Class Template

建構子定義在類別樣板之外template<class T>

Csamples<T>::Csamples(T values[], int count)

{

m_Free = count < 100 ? Cpunt:100;

for(int i=0; i<m_Free; i++)

m_Values[i]=Values[i];

}

Page 7: 類別樣板  Class Template

從類別樣板建立物件 Csamples <double> myData(10.0) Example 9_07.cpp

Page 8: 類別樣板  Class Template

多個參數的類別樣板

template<class T1, class T2>

class Cexample

{

private:

T1 m_value1;

T2 m_Value2;

}

Page 9: 類別樣板  Class Template

Chapter 10

類別繼承

Page 10: 類別樣板  Class Template

目標 由已存在類別定義新的類別 類別成員存取屬性關鍵字 protected 夥伴類別 虛擬函式 純虛擬函式 抽象類別 虛擬建構子 多重繼承

Page 11: 類別樣板  Class Template

類別 用來表示某種抽象事物 真實世界的物件的資料型態定義

Page 12: 類別樣板  Class Template

Example p384

Box• Length, Breadth, Height

Carton, CandyBox, Crate, BeerCrate

Page 13: 類別樣板  Class Template

類別繼承 衍生類別 (derived) 基礎類別 (base class) 類別以一個或多個類別為基礎來定義 衍生類別繼承 (inherit) 基礎類別的資料成

員和函式成員

Page 14: 類別樣板  Class Template

類別繼承 (cont.) 解構子、建構子、覆載的指定運算子等不

會被繼承 衍生類別有自己的解構子及建構子

Page 15: 類別樣板  Class Template

何為基礎類別 放在另一個類別定義中的類別 Ex: B 類別的定義中含 A 類別 A 是 B 的直接基礎類別 (direct base clas

s) Ex: p384

• CBox 是 CBeerCrate 的間接基礎類別 (indirect base class)

Page 16: 類別樣板  Class Template

Figure p385

Page 17: 類別樣板  Class Template

Example

class Cbox

{

public:

double m_Length;

double m_Breadth;

double m_Height;

Cbox(…..)

}

class CCandyBox: CBox{ public: char* m_Contents;

CCandyBox(char* str = "Candy") { m_Contents = new char[ strlen(str) + 1 ];

strcpy(m_Contents, str);}

~CCandyBox() { delete[] m_Contents; };

};

Page 18: 類別樣板  Class Template

Ex10_01.cpp

Page 19: 類別樣板  Class Template

說明 CBox:24bytes CCandyBox:32bytes 被繼承的基礎類別內定存取屬性 private class CCandyBox: private CBox class CCandyBox: public CBox 基礎類別一定要有存取屬性 , 用來決定被衍

生類別繼承後的成員存取狀態 若省略 , 則編譯器假設為 private

Page 20: 類別樣板  Class Template

繼承下的存取控制 基礎類別的 private 資料成員也是衍生類

別的成員 在衍生類別中將維持 private 屬性 p389

Page 21: 類別樣板  Class Template

存取基礎類別的 private 成員 Ex10_02.cppclass CBox{ public: CBox(double lv = 1.0, double bv = 1.0, double hv = 1.0): m_Length(lv), m_Breadth(bv), m_Height(hv){}

//Function to calculate the volume of a CBox object double Volume() const { return m_Length*m_Breadth*m_Height; }

private: double m_Length; double m_Breadth; double m_Height;};

Page 22: 類別樣板  Class Template

衍生類別建構子的運作 建立衍生類別的基礎類別部份 , 會呼叫基

礎類別的建構子而非衍生類別的建構子 Ex10_03.cpp 從衍生類別的建構子去呼叫基礎類別的某

個建構子 , 即可利用基礎類別的建構子將衍生類別的資料成員初始化

或用衍生類別建構子的資料去改變基礎類別建構子的內容

Page 23: 類別樣板  Class Template

呼叫基礎類別的建構子class CCandyBox: public CBox{ public: char* m_Contents;

// Constructor to set dimensions and contents // with explicit call of CBox constructor CCandyBox(double lv, double bv, double hv, char* str= "Candy") :CBox(lv, bv, hv) { cout << endl <<"CCandyBox constructor2 called"; m_Contents = new char[ strlen(str) + 1 ]; strcpy(m_Contents, str); }

// Constructor to set contents // calls default CBox constructor automatically CCandyBox(char* str= "Candy") { cout << endl << "CCandyBox constructor1 called"; m_Contents = new char[ strlen(str) + 1 ]; strcpy(m_Contents, str); }

~CCandyBox() // Destructor { delete[] m_Contents; }};