Presentation is loading. Please wait.

Presentation is loading. Please wait.

第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員.

Similar presentations


Presentation on theme: "第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員."— Presentation transcript:

1 第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員 17-7 樣板與朋友關係 17-7 樣板與朋友關係

2 17-1 樣板的基礎 - 什麼是樣板 樣板如同是函數和類別的模子,倒入塑膠就可以 做成塑膠成品,倒入金屬就是金屬鑄件。對比程 式來說,倒入樣板函數或類別是不同的資料型態, 換句話說,同一個函數或類別就可以依倒入的資 料型態不同,來處理整數、浮點數或字串等不同 資料型態的資料。 樣板如同是函數和類別的模子,倒入塑膠就可以 做成塑膠成品,倒入金屬就是金屬鑄件。對比程 式來說,倒入樣板函數或類別是不同的資料型態, 換句話說,同一個函數或類別就可以依倒入的資 料型態不同,來處理整數、浮點數或字串等不同 資料型態的資料。 樣板函數或類別屬於「泛型程式設計」 ( Generic Programming ),泛型撰寫的函數 或類別可以適用在不同資料型態,來達成相同功 能,其主要目的是讓程式設計者專注於演算法和 程式邏輯,而不用考量需要適用在不同資料型態 的問題。 樣板函數或類別屬於「泛型程式設計」 ( Generic Programming ),泛型撰寫的函數 或類別可以適用在不同資料型態,來達成相同功 能,其主要目的是讓程式設計者專注於演算法和 程式邏輯,而不用考量需要適用在不同資料型態 的問題。

3 17-1 樣板的基礎 - 樣板與過載函數 樣板與過載函數都可以建立同名函數來處理不同 資料型態的參數或傳回值。樣板函數只需一個函 數,就可以使用在 int 、 float 和 char 等多種不同 的資料型態,如下所示: 樣板與過載函數都可以建立同名函數來處理不同 資料型態的參數或傳回值。樣板函數只需一個函 數,就可以使用在 int 、 float 和 char 等多種不同 的資料型態,如下所示: template template T getMax(T, T); 上述程式碼是樣板函數宣告, T 是資料型態參數, 換句話說,資料型態也成為函數的一種參數,所 以同一個函數可以適用在多種不同資料型態。 上述程式碼是樣板函數宣告, T 是資料型態參數, 換句話說,資料型態也成為函數的一種參數,所 以同一個函數可以適用在多種不同資料型態。

4 17-2 樣板函數 17-2-1 單一參數的樣板函數 17-2-1 單一參數的樣板函數 17-2-2 多重樣板參數的樣板函數 17-2-2 多重樣板參數的樣板函數

5 17-2-1 單一參數的樣板函數 - 語 法 樣板函數是一種適用各種資料型態的函數, 所以函數原型宣告需要將資料型態也宣告 成參數,其宣告語法如下所示: 樣板函數是一種適用各種資料型態的函數, 所以函數原型宣告需要將資料型態也宣告 成參數,其宣告語法如下所示: template template 函數原型宣告 ; 上述樣板函數宣告是使用 template 關鍵字 開始,「 」角形括號中使用 class 定義型態參數的識別字,稱為樣板參 數,讀者可以自行命名,代表函數的資料 型態也是一個參數。 上述樣板函數宣告是使用 template 關鍵字 開始,「 」角形括號中使用 class 定義型態參數的識別字,稱為樣板參 數,讀者可以自行命名,代表函數的資料 型態也是一個參數。

6 17-2-1 單一參數的樣板函數 - 建立樣 板函數 樣板函數是將資料型態也視為參數,樣板 參數是函數原型宣告的傳回值和參數的資 料型態,例如: getMax() 樣板函數,如下 所示: 樣板函數是將資料型態也視為參數,樣板 參數是函數原型宣告的傳回值和參數的資 料型態,例如: getMax() 樣板函數,如下 所示: template template T getMax(T, T); 上述樣板函數宣告樣板參數 T ,函數 getMax() 傳入參數是此資料型態,傳回值 也是此資料型態。 上述樣板函數宣告樣板參數 T ,函數 getMax() 傳入參數是此資料型態,傳回值 也是此資料型態。

7 17-2-1 單一參數的樣板函數 - 呼叫樣 板函數 因為資料型態已經是一個樣板參數,所以 在呼叫樣板函數時,就需指定使用的資料 型態,如下所示: 因為資料型態已經是一個樣板參數,所以 在呼叫樣板函數時,就需指定使用的資料 型態,如下所示: value = getMax (cd,fd);

8 17-2-2 多重樣板參數的樣板函數 如果函數需要多種不同的資料型態時,我 們可以使用「, 」逗號分隔來宣告多個樣板 參數,換句話說,就是建立多重樣板參數 的樣板函數,如下所示: 如果函數需要多種不同的資料型態時,我 們可以使用「, 」逗號分隔來宣告多個樣板 參數,換句話說,就是建立多重樣板參數 的樣板函數,如下所示: template template T getMax(T, U); template template T getMin(T, U);

9 17-3 樣板類別 17-3-1 堆疊的樣板類別 17-3-1 堆疊的樣板類別 17-3-2 樣板類別的成員函數 17-3-2 樣板類別的成員函數

10 17-3-1 堆疊的樣板類別 - 說明 樣板類別的宣告類似樣板函數,例如:堆 疊( Stacks )資料結構的類別擁有兩種特 性,如下所示: 樣板類別的宣告類似樣板函數,例如:堆 疊( Stacks )資料結構的類別擁有兩種特 性,如下所示: 只允許從堆疊頂端存取資料。 只允許從堆疊頂端存取資料。 資料存取的順序是先進後出( Last Out, First In ),也就是先存入堆疊的資料,反而最後取 出。 資料存取的順序是先進後出( Last Out, First In ),也就是先存入堆疊的資料,反而最後取 出。

11 17-3-1 堆疊的樣板類別 - 宣告 template template class stack { private: T data[100]; T data[100]; int top; int top;public: stack() { top = -1; } stack() { top = -1; } ~stack() {} ~stack() {} bool isEmpty() { …… } bool isEmpty() { …… } void push(T val) { data[++top] = val; } void push(T val) { data[++top] = val; } T pop() { return data[top--]; } T pop() { return data[top--]; }};

12 17-3-1 堆疊的樣板類別 - 建立物件 在程式碼建立堆疊物件時,就可以指定樣 板類別使用的資料型態,如下所示: 在程式碼建立堆疊物件時,就可以指定樣 板類別使用的資料型態,如下所示: stack st; 上述程式碼宣告 stack 物件 st ,在括號中使 用資料型態 int ,換句話說,陣列 data[] 儲 存的資料型態是 int 整數;如果使用 float 浮 點數,堆疊就可以儲存 float 資料型態的資 料。 上述程式碼宣告 stack 物件 st ,在括號中使 用資料型態 int ,換句話說,陣列 data[] 儲 存的資料型態是 int 整數;如果使用 float 浮 點數,堆疊就可以儲存 float 資料型態的資 料。

13 17-3-2 樣板類別的成員函數 在樣板類別的成員函數如果和類別宣告不 位在同一個程式區塊,此時樣板類別的成 員函數需要使用 template 關鍵字進行宣告, 而且類別名稱開頭也需要加上樣板參數, 如下所示: 在樣板類別的成員函數如果和類別宣告不 位在同一個程式區塊,此時樣板類別的成 員函數需要使用 template 關鍵字進行宣告, 而且類別名稱開頭也需要加上樣板參數, 如下所示: template template bool stack ::isEmpty() { } 上述函數是樣板類別 stack 的成員函數 isEmpty() ,可以看到開頭類別名稱也擁有 樣板參數 T 。 上述函數是樣板類別 stack 的成員函數 isEmpty() ,可以看到開頭類別名稱也擁有 樣板參數 T 。

14 17-4 非型態參數的樣板類別 - 說明 在本節前的樣板類別和函數,樣板參數都 是代表資料型態,事實上,樣板參數也可 以是非資料型態的參數,其用途是指定類 別或函數中的常數值。 在本節前的樣板類別和函數,樣板參數都 是代表資料型態,事實上,樣板參數也可 以是非資料型態的參數,其用途是指定類 別或函數中的常數值。

15 17-4 非型態參數的樣板類別 - 宣告 stack 樣板類別的陣列 data[] 大小,可以改為非 型態參數來指定陣列大小,如下所示: stack 樣板類別的陣列 data[] 大小,可以改為非 型態參數來指定陣列大小,如下所示: template template class stack { private: T data[maxSize]; T data[maxSize]; int top; int top;public: ………… …………};

16 17-4 非型態參數的樣板類別 - 建立物 件 在宣告物件時,不只可以指定儲存的資料 型態,還可以指定陣列尺寸,如下所示: 在宣告物件時,不只可以指定儲存的資料 型態,還可以指定陣列尺寸,如下所示: stack st;

17 17-5 樣板類別的繼承 樣板類別也可以繼承其他樣板類別。例如: list 類 別是串列的樣板類別,筆者準備繼承 list 類別來建 立堆疊 stack 的樣板類別,如下所示: 樣板類別也可以繼承其他樣板類別。例如: list 類 別是串列的樣板類別,筆者準備繼承 list 類別來建 立堆疊 stack 的樣板類別,如下所示: template template class stack : public list { public: stack(): list () { } stack(): list () { } ~stack() { } ~stack() { } bool isEmpty() { return isListEmpty(); } bool isEmpty() { return isListEmpty(); } void push(T d) { insertNode(d); } void push(T d) { insertNode(d); } T pop() { return fetchNode(); } T pop() { return fetchNode(); }};

18 17-6 特化樣板與靜態成員 17-6-1 特化樣板函數 17-6-1 特化樣板函數 17-6-2 樣板與靜態成員 17-6-2 樣板與靜態成員

19 17-6-1 特化樣板函數 -result() 成員函 數 特化樣板( Template Specialization )允 許針對指定資料型態建立專屬實作。例如: add 類別的 result() 成員函數,可以將成員 資料 v1 和 v2 相加,如下所示: 特化樣板( Template Specialization )允 許針對指定資料型態建立專屬實作。例如: add 類別的 result() 成員函數,可以將成員 資料 v1 和 v2 相加,如下所示: template template T add ::result() { return v1 + v2; } 上述 result() 成員函數適用 int 、 float 和 double 等各種不同資料型態,其相加順序 是 v1 + v2 。 上述 result() 成員函數適用 int 、 float 和 double 等各種不同資料型態,其相加順序 是 v1 + v2 。

20 17-6-1 特化樣板函數 - 特化樣板函數 對於 string 類別的字串來說,字串相加即字串連 結,但是我們希望連結順序相反,此時可以針對 此資料型態建立特化樣板函數,如下所示: 對於 string 類別的字串來說,字串相加即字串連 結,但是我們希望連結順序相反,此時可以針對 此資料型態建立特化樣板函數,如下所示: template <> string add ::result() { return v2 + v1; } return v2 + v1; } 程式碼使用 template<> 建立特化樣板,針對 string 類別的資料型態建立 result() 成員函數的專 屬實作,函數傳回 v2 + v1 ,而不是 v1 + v2 。 程式碼使用 template<> 建立特化樣板,針對 string 類別的資料型態建立 result() 成員函數的專 屬實作,函數傳回 v2 + v1 ,而不是 v1 + v2 。

21 17-6-2 樣板與靜態成員 - 靜態成員資 料 在樣板類別的每一種套用的資料型態,都只擁有 一份專屬的靜態成員資料和函數。例如: myClass 樣板類別的靜態成員資料 value ,我們 可以針對不同資料型態指定其初值,如下所示: 在樣板類別的每一種套用的資料型態,都只擁有 一份專屬的靜態成員資料和函數。例如: myClass 樣板類別的靜態成員資料 value ,我們 可以針對不同資料型態指定其初值,如下所示: template T myClass ::value = 10; = 10; template <> int myClass ::value = 5; template <> char* myClass ::value = " 陳會安 "; = " 陳會安 ";

22 17-6-2 樣板與靜態成員 - 樣板函數的 靜態變數 在樣板函數宣告的靜態變數,對於每一個 樣板函數也都擁有一份專屬的靜態變數, 如下所示: 在樣板函數宣告的靜態變數,對於每一個 樣板函數也都擁有一份專屬的靜態變數, 如下所示: template template void myFunc(T t) { static T value = 0; static T value = 0; value = t ; value = t ; cout << "value = " << value << endl ; cout << "value = " << value << endl ;}

23 17-7 樣板與朋友關係 - 朋友函數 ( 範例 ) class A { // 非樣板類別 A template friend int e(); // 樣板成員函數 e() template friend int e(); // 樣板成員函數 e()} template f(); // 全域樣板函數 f() template class B { // 樣板類別 B friend int g(); friend int g(); friend int h(U&); friend int h(U&); friend int f (); friend int f (); template friend int i(); template friend int i(); C::j(); C::j(); D ::k(U&); D ::k(U&);};

24 17-7 樣板與朋友關係 - 朋友函數 ( 範例說明 )

25 17-7 樣板與朋友關係 - 朋友類別 ( 範例 ) 至於樣板與朋友類別之間的關係,筆者也 準備使用下列實例來說明,如下所示: 至於樣板與朋友類別之間的關係,筆者也 準備使用下列實例來說明,如下所示: template class template class class A { friend class B; friend class B; friend class C ; friend class C ;}

26 17-7 樣板與朋友關係 - 朋友類別 ( 範例說明 ) 各種朋友類別的說明,如下表所示: 各種朋友類別的說明,如下表所示:


Download ppt "第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員."

Similar presentations


Ads by Google