在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> 2 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 }
關於類模板的使用:類模板的使用實際上是將類模板實例化成一個具體的類,它的格式為:類名<實際的類型>
模板類是類模板實例化后的一個產物,說個具體點的例子吧,我們把類模板比作是一個做餅干的模子,而模板類就是用這個模子做出來的餅干,至於這個餅干是什么味道的就要看你自己在實例化時用的是什么材料了,你可以做巧克力餅干,也可以做牛奶餅干,這些餅干出了材料不一樣外,其它的東西都是一樣的了。