我們已經學過重載(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 ; }
同樣的,對於類而言,也存在同樣的問題(基本上是重復性的工作):
//對兩個整數作比較 class Compare_int { public: Compare(int a,int b){x=a;y=b;} int max( ) {return(x>y)?x:y;} int min( ) {return(xy)?x:y;} float min( ) {return(x
為解決上述問題 C++ 引入模板機制:模板就是實現代碼重用機制的一種工具,它可以實現類型參數化,即把類型定義為參數, 從而實現了真正的代碼可重用性。模版可以分為兩類,一個是函數模版,另外一個是類模版。
函數模板
函數模板的一般形式如下:
template
返回類型 函數名(形參表) {
//函數定義體
}
其中 template 和 class 是關鍵字,class 可以用 typename 代替,在這裡 typename 和 class 沒區別,<> 括號中的參數叫模板形參,模板形參和函數形參很相像,模板形參不能為空。
一但聲明了類模板,函數中使用內置類型的地方都可以使用模板形參名來聲明。模板形參需要調用該模板函數時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參類型就稱他實例化了函數模板的一個實例。
templatevoid swap(T& a, T& b) { //…… }
當調用這樣的模板函數時類型 T 就會被被調用時的類型所代替,比如 swap(a,b) 其中 a 和 b 是 int 型,這時模板函數 swap 中的形參 T 就會被 int 所代替,模板函數就變為 swap(int &a, int &b)。而當 swap(c,d) 其中 c 和 d 是 double 類型時,模板函數會被替換為swap(double &a, double &b),這樣就實現了函數的實現與類型無關的代碼。
示例代碼如下:
#includeusing std::cout; using std::endl; //聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小, //class也可以被typename代替, //T可以被任何字母或者數字代替。 //template template T max(T x,T y) { return(x>y)?x:y; } int main() { int a=2, b=10; cout<< "較大整數:"<
運行結果如下:
類模板
類模板的一般形式如下:
template
class 類名 { //類定義...
};
一但聲明了類模板就可以用類模板的形參名聲明類中的成員變量和成員函數,即可以在類中使用內置類型的地方都可以使用模板形參名來聲明。比如:
templateclass A { public: T a; T b; T hy(T c, T &d); };
在類 A 中聲明了兩個類型為T的成員變量 a 和 b,還聲明了一個返回類型為 T 帶兩個參數類型為 T 的函數 hy。
類模板對象的創建:比如一個模板類 A,則使用類模板創建對象的方法為 A
m; 在類 A 後面跟上一個 <> 尖括號並在裡面填上相應的類型,這樣的話類 A 中凡是用到模板形參的地方都會被 int 所代替。當類模板有兩個模板形參時創建對象的方法為 Am; 類型之間用逗號隔開。
在類模板外部定義成員函數的方法為:
template<模板形參列表> 函數返回類型 類名<模板形參名>::函數名(參數列表){函數體}
比如有兩個模板形參 T1,T2 的類 A 中含有一個 void h() 函數,則定義該函數的語法為:
templateclass A { public: void h(); }; template void A ::h() { // …… }
注意:模板的聲明或定義只能在全局,命名空間或類范圍內進行。即不能在局部范圍,函數內進行,比如不能在 main() 函數中聲明或定義一個模板。
示例代碼如下:
#includeusing namespace std; template class Compare //類模板 { public: //Compare(numtype a,numtype b){x=a;y=b;} Compare(numtype a,numtype b); numtype max(){return (x>y)?x:y;} numtype min(){return (x Compare ::Compare(numtype a,numtype b) { x=a; y=b; } int main( ) { Compare cmp1(3,7); //定義對象cmp1,用於兩個整數的比較 cout << cmp1.max() << " is the Maximum" << endl; cout << cmp1.min() << " is the Minimum" << endl << endl; Compare cmp2(45.78,93.6); //定義對象cmp2,用於兩個浮點數的比較 cout << cmp2.max() << " is the Maximum" < cmp3('a', 'A'); //定義對象cmp3,用於兩個字符的比較 cout << cmp3.max() << " is the Maximum" <
運行結果如下:
本教程示例代碼下載請點此處。
參考資料:
http://www.cnblogs.com/gw811
http://www.cnblogs.com/gaojun