C 類模板(模板類)詳解

2021-10-03 04:59:53 字數 1781 閱讀 2211

人們需要編寫多個形式和功能都相似的函式,因此有了函式模板來減少重複勞動;人們也需要編寫多個形式和功能都相似的類,於是 c++ 引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程式設計師的重複勞動。

例如,在《c++運算子過載》一章中的《c++實現可變長度的動態陣列》一節中,我們實現了乙個可變長的整型陣列類,可能還需要可變長的 double 陣列類,可變長的 cstudent 陣列類,等等。如果要把類似於可變長整型陣列類的**都重寫一遍,無疑非常麻煩。有了類模板的機制,只需要寫乙個可變長的陣列類模板,編譯器就會由該類模板自動生成整型、double 型等各種型別的可變長陣列類了。

template 《型別參數列》

class 類模板名;

引數:

class類塑引數1, class型別引數2, ...
類模板中的成員函式放到類模板定義外面寫時的語法如下:

template 《型別參數列》

返回值型別  類模板名《型別引數名列表》::成員函式名(參數列)

用類模板定義物件的寫法如下:

類模板名《真實型別參數列》 物件名(建構函式實際參數列);

如果類模板有無參建構函式,那麼也可以使用如下寫法:

類模板名 《真實型別參數列》 物件名;

類模板看上去很像乙個類。下面以 pair 類模板為例來說明類模板的寫法和用法。

實踐中常常會碰到,某項資料記錄由兩部分組成,一部分是關鍵字,另一部分是值。關鍵字用來對記錄進行排序和檢索,根據關鍵字能查到值。例如,學生記錄由兩部分組成,一部分是學號,另一部分是績點。要能根據學號對學生進行排序,以便方便地檢索績點,則學號就是關鍵字,績點就是值。

下面的pair類模板就可用來處理這樣的資料記錄:

#include #include using namespace std;

template class pair

; bool operator < (const pair& p) const;

};templatebool pair::operator < (const pair& p) const

//pair的成員函式 operator <

int main()

程式的輸出結果是:

tom 19

例項化乙個類模板時,如第 21 行,真實型別參數列中的引數是具體的型別名,如 string、int 或其他類的名字(如 cstudent)等,它們用來一一對應地替換類模板定義中「型別參數列」中的型別引數。類模板名 《真實型別參數列》就成為乙個具體的類的名字。

編譯器編譯到第 21 行時,就會用 string 替換 pair 模板中的 t1,用 int 替換 t2,其餘部分原樣保留,這樣就自動生成了乙個新的類。這個類的名字編譯器是如何處理的不需要知道,可以認為它的名字就是 pair 。也可以說,student 物件的型別就是 pair。

pair類的成員函式自然也是通過替換 pair 模板的成員函式中的 t1、t2 得到的。

編譯器由類模板生成類的過程叫類模板的例項化。由類模板例項化得到的類叫模板類。

類模板中的成員函式還可以是乙個函式模板。成員函式模板只有在被呼叫時才會被例項化。例如下面的程式:

#include using namespace std;

template class a

//成員函式模板

};int main()

程式的輸出結果是:

khello

C 類模板(模板類)詳解

人們需要編寫多個形式和功能都相似的函式,因此有了函式模板來減少重複勞動 人們也需要編寫多個形式和功能都相似的類,於是 c 引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程式設計師的重複勞動。例如,在 c 運算子過載 一章中的 c 實現可變長度的動態陣列 一節中,我們實現了乙個可變長的整...

C 類模板與模板類詳解

在c 的template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?事實上class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別,後來為了避免class在這兩個地方的使...

C 類模板與模板類詳解

在c 的template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?事實上class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別,後來為了避免class在這兩個地方的使...