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

2022-12-09 12:00:50

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 }

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