類模板和模板類主要關注點是後一個單詞。
類別範本:主要描述的是模板,這個模板是類的模板。可以理解為一個通用的類,這個類中的資料成員,成員函數的形參型別以及成員函數的返回值型別不用具體的指定,這些型別都是虛擬的。在使用類別範本進行物件定義的時候,才會根據物件的實際引數型別來替代類別範本中的虛擬型別。通俗一點來說,可以看作是做蛋糕的模具。類別範本標準定義格式如下:
1 template <typename 型別引數> 2 class 類名 3 { 4 類成員宣告 5 };
或者:
1 template <class 型別引數> 2 class 類名 3 { 4 類成員宣告 5 };
(1)template:這是宣告類別範本的關鍵字,表明這是一個類別範本。
(2)尖括號<>中,typename和class的作用都一樣,都是用作來申明後面的引數是一個虛擬的資料引數型別。
(3)型別引數:用C++識別符號:Type或者T來表示,表示這是一個虛擬的資料型別名,此時在類別範本中不給定具體的資料型別,範例化成模板類後,就需要給定具體的資料型別。
模板類:主要描述的是類,這個類使用類別範本進行宣告。將類別範本中的虛擬型別引數指定成一個具體的資料型別引數。通俗一點來說可以看作是通過蛋糕模具做出來的蛋糕。
1,定義一個比較兩個元素大小的類別範本;
2,使用該類別範本進行範例化,實現用模板類定義物件。
1 #include <iostream> 2 using namespace std; 3 template <class T> //宣告一個模板,虛擬資料型別名為T 4 class Compare //類別範本名為Compare 5 { 6 public : 7 Compare(T a, T b) 8 { 9 x = a; 10 y = b; 11 } 12 13 T max( ) //類別範本中的成員函數 14 { 15 return (x > y) ? x : y; 16 } 17 18 private : 19 T x; 20 T y; 21 }; 22 23 int main() 24 { 25 Compare<int>fun1(5,8); //用類別範本定義物件fun1,此時T被int替代 26 Compare<float>fun2(9.1,9.7); //用類別範本定義物件fun2,此時T被float替代 27 Compare<char>fun3('a','h'); //用類別範本定義物件fun3,此時T被char替代 28 cout<<"最大值是:"<<fun1.max()<<endl; 29 cout<<"最大值是:"<<fun2.max()<<endl; 30 cout<<"最大值是:"<<fun3.max()<<endl; 31 return 0; 32 }
最終程式列印結果依次為:
1 最大值是:8 2 最大值是:9.7 3 最大值是:h
可以從程式舉例中看出使用類別範本Compare進行範例化,生成了3個型別分別為Compare<int>、Compare<float>、Compare<char>的模板類,這3個模板類經範例化後又生成了3個物件成員fun1、fun2、fun3。物件成員可以呼叫類別範本中定義的成員函數max()。類別範本表示了通用的類,模板類表示了經過範例化後帶具體資料型別引數的類。
另外,在類別範本中,類別範本的成員函數是在類別範本體內定義。而類別範本中的成員函數也可以在類別範本體外定義。那麼就需要遵循以下規則:
(1)需要在成員函數定義之前進行模板宣告;
(2)在成員函數名前加上"類名<型別引數>::";
之前的程式舉例中main函數之前的類別範本宣告就要改為如下格式:
1 template<typename T> //宣告一個模板,虛擬資料型別名為T 2 class Compare 3 { 4 public : 5 Compare(T a, T b) 6 { 7 x = a; 8 y = b; 9 } 10 11 T max( ) //類別範本中的成員函數 12 13 private : 14 T x; 15 T y; 16 }; 17 18 template<typename T> //在成員函數定義之前進行模板宣告 19 T Compare<T>::max() //在成員函數名前加上"類名<型別引數>::" 20 { 21 return (x > y) ? x : y; 22 }
更多技術內容和書籍資料獲取敬請關注微信公眾號「明解嵌入式」
本文來自部落格園,作者:Sharemaker,轉載請註明原文連結:https://www.cnblogs.com/Sharemaker/p/16967748.html