1分鐘理清楚C++類模板和模板類區別
1、定義區別
類模板和模板類主要關注點是後一個單詞。
類模板:主要描述的是模板,這個模板是類的模板。可以理解為一個通用的類,這個類中的資料成員,成員函式的形參型別以及成員函式的返回值型別不用具體的指定,這些型別都是虛擬的。在使用類模板進行物件定義的時候,才會根據物件的實際引數型別來替代類模板中的虛擬型別。通俗一點來說,可以看作是做蛋糕的模具。類模板標準定義格式如下:
1 template <typename 型別引數> 2 class 類名 3 { 4 類成員宣告 5 };
或者:
1 template <class 型別引數> 2class 類名 3 { 4 類成員宣告 5 };
(1)template:這是宣告類模板的關鍵字,表明這是一個類模板。
(2)尖括號<>中,typename和class的作用都一樣,都是用作來申明後面的引數是一個虛擬的資料引數型別。
(3)型別引數:用C++識別符號:Type或者T來表示,表示這是一個虛擬的資料型別名,此時在類模板中不給定具體的資料型別,例項化成模板類後,就需要給定具體的資料型別。
模板類:主要描述的是類,這個類使用類模板進行宣告。將類模板中的虛擬型別引數指定成一個具體的資料型別引數。通俗一點來說可以看作是通過蛋糕模具做出來的蛋糕。
2、程式舉例
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 13T 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 }
更多技術內容和書籍資料獲取敬請關注微信公眾號“明解嵌入式”