C++ 類别範本的寫法

奇妙之二進位制發表於2021-01-03

在C++的Template中很多地方都用到了typename與class這兩個關鍵字,有時候這兩者可以替換,那麼這兩個關鍵字是否完全一樣呢?

事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡class關鍵字表明T是一個型別,後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為一個型別,這樣在定義模板的時候可以使用下面的方式了:

template<typename T>

在模板定義語法中關鍵字class與typename的作用完全一樣。

區分類别範本與模板類的概念

一個類别範本(類生成類)允許使用者為類定義個一種模式,使得類中的某些資料成員、預設成員函式的引數,某些成員函式的返回值,能夠取任意型別(包括系統預定義的和使用者自定義的)。

如果一個類中的資料成員的資料型別不能確定,或者是某個成員函式的引數或返回值的型別不能確定,就必須將此類宣告為模板,它的存在不是代表一個具體的、實際的類,而是代表一類類。

類别範本定義

定義一個類别範本,一般有兩方面的內容:

A。首先要定義一個類,其格式為:

template<class T>
class test
{
....
}

test為類名,在類定義體中,如果採用通用資料型別的成員,函式引數的前面需加上T,其中通用型別T可以作為普通成員變數的型別。還可以作為成員函式的引數和返回型別等。

例如:

 1 template<class T>
 3 class Test
 4 {
 5 private:
 6     T n;
 7     const T i;
 8 public:
 9     Test():i(0) {}
10     Test(T k);
11     ~Test(){}
12 
13     void print();
14     T operator+(T x);
15 };

類别範本類外實現成員函式

如果在類外實現成員函式,若此成員函式中有模板引數存在,則除了需要和一般類的類外定義成員函式一樣的定義外,還需要在函式外進行模板宣告,並且類字首也要包含模板。
例如:

1 template<class T>
2 void Test<T>::print()
3 {
4     std::cout<<"n="<<n<<std::endl;
5     std::cout<<"i="<<i<<std::endl;
6 }
1 template<class T>
2 Test<T>::Test(T k):i(k){ n=k;}
3 
4 template<class T>
5 T Test<T>::operator+(T x){
6     return n + x;
7 }

關於類别範本的使用:類别範本的使用實際上是將類别範本例項化成一個具體的類,它的格式為:類名<實際的型別>

模板類是類别範本例項化後的一個產物,說個具體點的例子吧,我們把類别範本比作是一個做餅乾的模子,而模板類就是用這個模子做出來的餅乾,至於這個餅乾是什麼味道的就要看你自己在例項化時用的是什麼材料了,你可以做巧克力餅乾,也可以做牛奶餅乾,這些餅乾出了材料不一樣外,其它的東西都是一樣的了。

類别範本的宣告

template <typename T>
class A;

類别範本的宣告同樣要加template。

相關文章