在C++的Template中不少地方都用到了typename與class這兩個關鍵字,有時候這二者能夠替換,那麼這兩個關鍵字是否徹底同樣呢?c++
事實上class用於定義類,在模板引入c++後,最初定義模板的方法爲:template<class T>,這裏class關鍵字代表T是一個類型,後來爲了不class在這兩個地方的使用可能給人帶來混淆,因此引入了typename這個關鍵字,它的做用同class同樣代表後面的符號爲一個類型,這樣在定義模板的時候可使用下面的方式了:函數
template<typename T>.在模板定義語法中關鍵字class與typename的做用徹底同樣spa
區分類模板與模板類的概念code
一個類模板(類生成類)容許用戶爲類定義個一種模式,使得類中的某些數據成員、默認成員函數的參數,某些成員函數的返回值,可以取任意類型(包括系統預約義的和用戶自定義的)。blog
若是一個類中的數據成員的數據類型不能肯定,或者是某個成員函數的參數或返回值的類型不能肯定,就必須將此類聲明爲模板,它的存在不是表明一個具體的、實際的類,而是表明一類類。模板
類模板定義:class
定義一個類模板,通常有兩方面的內容:test
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 }
關於類模板的使用:類模板的使用其實是將類模板實例化成一個具體的類,它的格式爲:類名<實際的類型>
模板類是類模板實例化後的一個產物,說個具體點的例子吧,咱們把類模板比做是一個作餅乾的模子,而模板類就是用這個模子作出來的餅乾,至於這個餅乾是什麼味道的就要看你本身在實例化時用的是什麼材料了,你能夠作巧克力餅乾,也能夠作牛奶餅乾,這些餅乾出了材料不同外,其它的東西都是同樣的了。