(原創)我的理解:ios
模板,故名思義,就是一個模子;函數
模板分爲:類模板和函數模板(也可叫模板類和模板函數);工具
模板特色:(1)函數名字同樣;spa
(2)調用的形參的數據類型不一樣,但形參個數相同;指針
(3)函數實現的功能同樣,由於實質上就是一個函數;code
模板形式:模板需再類或者函數定義前加上 template<typename T> 或 template<class T>,函數實現中的形參類型也須要是 T ;對象
其中,T就是數據類型,int/float/char或者本身定義的結構體類型;blog
好比:資源
template<typename T> 或 template<class T>io
T funName( T parm1,T parm2 )
{
//函數返回類型爲T;
}
或者自定義固定的返回類型:
template<typename T> 或 template<class T>
int funName( T parm1,T parm2 )
{
//函數返回類型爲int;
}
固然上面int也可爲float/void等類型;
===================================================================================
模板與重載的區別:
重載,顧名思義,從新加載/從新載入,也就是重生了一個函數(就如人思想重生,外表同樣,可什麼都和之前不同了);
1 相同點
二者都是一個函數名字;
均可完成不一樣形參類型的參數輸入到相同函數名字的功能;
2 不一樣點
重載的形參個數可不一樣,模板需相同;
重載的函數實現功能可不一樣,模板實現功能相同;
重載需一個一個的列舉出函數定義,模板就一個便可;
================================================================================
下面是轉摘資源:
1. 模板的概念。
咱們已經學過重載(Overloading),對重載函數而言,C++的檢查機制能經過函數參數的不一樣及所屬類的不一樣。正確的調用重載函數。例如,爲求兩個數的最大值,咱們定義MAX()函數須要對不一樣的數據類型分別定義不一樣重載(Overload)版本。
//函數1. int max(int x,int y); {return(x>y)?x:y ;} //函數2. float max( float x,float y){ return (x>y)? x:y ;} //函數3. double max(double x,double y) {return (c>y)? x:y ;}
但若是在主函數中,咱們分別定義了 char a,b; 那麼在執行max(a,b);時 程序就會出錯,由於咱們沒有定義char類型的重載版本。
如今,咱們再從新審視上述的max()函數,它們都具備一樣的功能,即求兩個數的最大值,可否只寫一套代碼解決這個問題呢?這樣就會避免因重載函數定義不 全面而帶來的調用錯誤。爲解決上述問題C++引入模板機制,模板定義:模板就是實現代碼重用機制的一種工具,它能夠實現類型參數化,即把類型定義爲參數, 從而實現了真正的代碼可重用性。模版能夠分爲兩類,一個是函數模版,另一個是類模版。
2. 函數模板的寫法
函數模板的通常形式以下:
Template <class或者也能夠用typename T> 返回類型 函數名(形參表) {//函數定義體 }
說明: template是一個聲明模板的關鍵字,表示聲明一個模板關鍵字class不能省略,若是類型形參多餘一個 ,每一個形參前都要加class <類型 形參表>能夠包含基本數據類型能夠包含類類型.
請看如下程序:
//Test.cpp #include <iostream> using std::cout; using std::endl;
//聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小,class也能夠被typename代替,
//T能夠被任何字母或者數字代替。
template <class T> T min(T x,T y) { return(x<y)?x:y;} void main( ) { int n1=2,n2=10; double d1=1.5,d2=5.6; cout<< "較小整數:"<<min(n1,n2)<<endl; cout<< "較小實數:"<<min(d1,d2)<<endl; system("PAUSE"); }
程序運行結果:
程序分析:main()函數中定義了兩個整型變量n1 , n2 兩個雙精度類型變量d1 , d2而後調用min( n1, n2); 即實例化函數模板T min(T x, T y)其中T爲int型,求出n1,n2中的最小值.同理調用min(d1,d2)時,求出d1,d2中的最小值.
3. 類模板的寫法
定義一個類模板:
Template < class或者也能夠用typename T > class類名{ //類定義...... };
說明:其中,template是聲明各模板的關鍵字,表示聲明一個模板,模板參數能夠是一個,也能夠是多個。
例如:定義一個類模板:
// ClassTemplate.h #ifndef ClassTemplate_HH #define ClassTemplate_HH template<typename T1,typename T2> class myClass{ private: T1 I; T2 J; public: myClass(T1 a, T2 b);//Constructor void show(); }; //這是構造函數 //注意這些格式 template <typename T1,typename T2> myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){} //這是void show(); template <typename T1,typename T2> void myClass<T1,T2>::show() { cout<<"I="<<I<<", J="<<J<<endl; } #endif // Test.cpp #include <iostream> #include "ClassTemplate.h" using std::cout; using std::endl; void main() { myClass<int,int> class1(3,5); class1.show(); myClass<int,char> class2(3,'a'); class2.show(); myClass<double,int> class3(2.9,10); class3.show(); system("PAUSE"); }
最後結果顯示:
通常來講,非類型模板參數能夠是常整數(包括枚舉)或者指向外部連接對象的指針。
那麼就是說,浮點數是不行的,指向內部連接對象的指針是不行的。
template<typename T, int MAXSIZE> class Stack{ Private: T elems[MAXSIZE]; … }; Int main() { Stack<int, 20> int20Stack; Stack<int, 40> int40Stack; … };