人們需要編寫多個形式和功能都相似的函式,因此有了函式模板來減少重複勞動;人們也需要編寫多個形式和功能都相似的類,於是 c++ 引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程式設計師的重複勞動。
例如,在《c++運算子過載》一章中的《c++實現可變長度的動態陣列》一節中,我們實現了乙個可變長的整型陣列類,可能還需要可變長的 double 陣列類,可變長的 cstudent 陣列類,等等。如果要把類似於可變長整型陣列類的**都重寫一遍,無疑非常麻煩。有了類模板的機制,只需要寫乙個可變長的陣列類模板,編譯器就會由該類模板自動生成整型、double 型等各種型別的可變長陣列類了。
c++ 中類模板的寫法如下:
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在這兩個地方的使...