1. 程式人生 > 其它 >1分鐘理清楚C++類模板和模板類區別

1分鐘理清楚C++類模板和模板類區別

1、定義區別       

  類模板和模板主要關注點是後一個單詞。

  類模板:主要描述的是模板,這個模板是類的模板。可以理解為一個通用的類,這個類中的資料成員,成員函式的形參型別以及成員函式的返回值型別不用具體的指定,這些型別都是虛擬的。在使用類模板進行物件定義的時候,才會根據物件的實際引數型別來替代類模板中的虛擬型別。通俗一點來說,可以看作是做蛋糕的模具。類模板標準定義格式如下:

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來表示,表示這是一個虛擬的資料型別名,此時在類模板中不給定具體的資料型別,例項化成模板類後,就需要給定具體的資料型別。

  模板類:主要描述的是類,這個類使用類模板進行宣告。將類模板中的虛擬型別引數指定成一個具體的資料型別引數。通俗一點來說可以看作是通過蛋糕模具做出來的蛋糕。

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    
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 }

更多技術內容和書籍資料獲取敬請關注微信公眾號“明解嵌入式”