標籤:味道 oid cti article static成員 com ble XML 關鍵字
1、在c++Template中非常多地方都用到了typename與class這兩個關鍵字,並且好像能夠替換,是不是這兩個關鍵字全然一樣呢?
答:class用於定義類,在模板引入c++後,最初定義模板的方法為:template,這裡class關鍵字表明T是一個類型。後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字。它的作用同class一樣表明後面的符號為一個類型。這樣在定義模板的時候就能夠使用以下的方式了: template.在模板定義文法中關鍵字class與typename的作用全然一樣。
2.類模板與模板類的概念
(1) 什麼是類模板
一個類模板(也稱為類屬類或類產生類)同意使用者為類定義一種模式。使得類中的某些資料成員、默寫成員函數的參數、某些成員函數的傳回值,能夠取隨意類型(包含系統提前定義的和使用者自己定義的)。
假設一個類中資料成員的資料類型不能確定。或者是某個成員函數的參數或傳回值的類型不能確定。就必須將此類聲明為模板,它的存在不是代表一個詳細的、實際的類,而是代表著一類類。
(2)類模板定義
定義一個類模板,一般有雙方面的內容:
A.首先要定義類,其格式為:
template <class T>class foo{……}
foo 為類名,在類定義體中,如採用通用資料類型的成員,函數參數的前面需加上T。當中通用類型T能夠作為普通成員變數的類型,還能夠作為const和static成員變數以及成員函數的參數和傳回型別之用。
比如:
template<class T>class Test{private: T n; const T i; static T cnt;public: Test():i(0){} Test(T k); ~Test(){} void print(); T operator+(T x);};
B. 在類定義體外定義成員函數時,若此成員函數中有模板參數存在,則除了須要和一般類的體外定義成員函數一樣的定義外,還需在函數體外進行模板聲明
比如
template<class T>void Test<T>::print(){ std::cout<<"n="<<n<<std::endl; std::cout<<"i="<<i<<std::endl; std::cout<<"cnt="<<cnt<<std::endl;}
假設函數是以通用類型為傳回型別,則要在函數名前的類名尾碼上“”。
比如:
template<class T>Test<T>::Test(T k):i(k){n=k;cnt++;}template<class T>T Test<T>::operator+(T x){ return n + x; }
C. 在類定義體外初始化const成員和static成員變數的做法和普通類體外初始化const成員和static成員變數的做法基本上是一樣的,唯一的差別是需再對模板進行聲明,比如
template<class T>int Test<T>::cnt=0;template<class T>Test<T>::Test(T k):i(k){n=k;cnt++;}
(3) 類模板的使用 類模板的使用實際上是將類模板執行個體化成一個詳細的類。它的格式為:類名<實際的類型>。
模板類是類模板執行個體化後的一個產物。說個形象點的範例吧。
我把類模板比作一個做餅乾同的模子,而模板類就是用這個模子做出來的餅乾,至於這個餅乾是什麼味道的就要看你自己在執行個體化時用的是什麼材料了,你能夠做巧克力餅乾,也能夠做豆沙餅乾,這些餅乾的除了材料不一樣外,其它的東西都是一樣的了。
3.函數模板和模板函數
(1)函數模板
函數模板能夠用來建立一個通用的函數。以支援多種不同的形參。避免重載函數的函數體反覆設計。
它的最大特點是把函數使用的資料類型作為參數。
函數模板的聲明形式為:
template<typename(或class) T><傳回型別><函數名>(參數表){ 函數體}
當中,template是定義模板函數的關鍵字;template後面的角括弧不能省略;typename(或class)是聲明資料類型參數標識符的關鍵字。用以說明它後面的標識符是資料類型標識符。這樣,在以後定義的這個函數中,凡希望依據實參資料類型來確定資料類型的變數,都能夠用資料類型參數標識符來說明,從而使這個變數能夠適應不同的資料類型。
比如:
template<typename(或class) T>T fuc(T x, T y){ T x; //……}
函數模板僅僅是聲明了一個函數的描寫敘述即模板。不是一個能夠直接啟動並執行函數,僅僅有依據實際情況用實參的資料類型取代類型參數標識符之後,才乾產生真正的函數。
(2)模板函數:
模板函數的產生就是將函數模板的類型形參執行個體化的過程。
比如:
double d; int a; fuc(d,a);
則系統將用實參d的資料類型double去取代函數模板中的T產生函數:
double fuc(double x,int y){ double x; //……}
C++中 模板Template的使用