您好,登錄后才能下訂單哦!
》模板的引入,為什么要使用模板?
在程序設(shè)計(jì)中往往存在這樣一種現(xiàn)象:兩個(gè)或多個(gè)函數(shù)的函數(shù)體完全相同,差別僅在于他們的參數(shù)類型不同,就需要分別給不同的數(shù)據(jù)類型定義不同的版本。
解決以上問題的一個(gè)比較好的方法就是使用模板。模板是實(shí)現(xiàn)代碼重用機(jī)制的一種工具,他可以實(shí)現(xiàn)類型參數(shù)化,即把類型定義為參數(shù),從而實(shí)現(xiàn)代碼復(fù)用。
》模板的分類:
模板分為函數(shù)模板和類模板。他們分別允許用戶構(gòu)造模板函數(shù)和模板類。
》函數(shù)模板:
建立一個(gè)通用函數(shù),其函數(shù)返回類型和形參類型不確定,用一個(gè)虛擬的類型來代表,這個(gè)通用函數(shù)就稱為函數(shù)模板。
函數(shù)模板聲明格式:
template <typename 類型參數(shù)>
返回類型 函數(shù)名(模板形參表)
{函數(shù)體
}
其中template是一個(gè)表明聲明一個(gè)模板的關(guān)鍵字;
typename也可以用class作用一樣表示其后是一個(gè)虛擬的類型名;
類型參數(shù)實(shí)際上是一個(gè)類型名;
例:
template <typename T> T max(T x, T y) { return (x > y) ? x : y; }
》如何使用函數(shù)模板
上面max()函數(shù)代表一類函數(shù),要使用這個(gè)模板函數(shù)就需要將T實(shí)例化為確定的數(shù)據(jù)類型,這個(gè)實(shí)例化的參數(shù)就叫做模板實(shí)參。
函數(shù)名(模板實(shí)參表)
例:
template <typename T> T max(T x, T y) { return (x > y) ? x : y; } int main() { int i1 = 19,i2=23; double d1 = 50.344, d2 = 4656.346; char c1 = 'k', c2 = 'n'; cout << "The max of i1,i2 is= " << max(i1, i2) << endl; cout << "The max of d1,d2 is= " << max(d1, d2) << endl; cout << "The max of c1,c2 is= " << max(c1, c2) << endl; return 0; }
結(jié)果:
從上例看出,函數(shù)模板提供了一類函數(shù)的抽象,它以類型參數(shù)T為參數(shù)及函數(shù)返回值的虛擬類型。函數(shù)模板經(jīng)實(shí)例化而生成的具體函數(shù)稱為模板函數(shù)。
》一個(gè)和指針相關(guān)的函數(shù)模板
template <typename AT> AT sum(AT* array, int size = 0) { AT total = 0; for (int i = 0; i < size; i++) { total += array[i]; } return total; }; int int_array[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 1010 }; double double_array[] = { 11.1,22.2,33.3, 44.4, 55.5, 66.6, 77.7, 88.8, 99.9, 100.10 }; int main() { int itotal = sum(int_array, 10); double dtotal = sum(double_array, 10); cout << "這個(gè)整型數(shù)組的元素之和是:" << itotal << endl; cout << "這個(gè)雙精度型數(shù)組的元素之和是:" << dtotal << endl; return 0; }
結(jié)果:
在程序中生成了兩個(gè)模板函數(shù),sum(int_array)和sum(double_array)分別將類型參數(shù)實(shí)例化為int型和double型。
》同樣的函數(shù)模板也允許使用多個(gè)類型參數(shù),但是template定義部分的每個(gè)類型參數(shù)前必須要有關(guān)鍵字typename。
template <typename para1,typename para2> void two_para(para1 x, para2 y) { cout << x << ' ' << y << endl; } int main() { two_para(99, "zhang"); two_para(123.45, 888L); return 0; }
結(jié)果:
1.在這個(gè)程序中,生成了兩個(gè)模板函數(shù),“two_para(99,"zhang")”,分別用模板實(shí)參int,char*將類型參數(shù)para1和para2實(shí)例化,“two_para(123.45,888L)”,分別用模板實(shí)參double,long將類型參數(shù)para1和para2實(shí)例化,
2.在template語句與函數(shù)模板定義語句之前不允許插入別的語句。
3.同一般函數(shù)一樣,函數(shù)模板也可以重載。
》
template <typename Type> Type min(Type x, Type y) { return (x < y) ? x : y; } template <typename Type> Type min(Type x, Type y, Type z) { Type t; t = (x < y) ? x : y; return (t < z) ? t: z; } int main() { int m = 10, n = 20, min2; double a = 10.1, b = 20.2, c = 30.3, min3; min2 = min(m, n); min3 = min(a, b, c); cout << "min(" << m << "," << n << ")=" << min2 << endl; cout << "min(" << a << "," << b << "," << c << ")=" << min3 << endl; return 0; }
結(jié)果:
》函數(shù)模板和非函數(shù)模板可以重載,調(diào)用順序是:首先尋找一個(gè)參數(shù)完全匹配的非函數(shù)模板,如果找到就調(diào)用它,如果沒有就尋找函數(shù)模板將其實(shí)例化,產(chǎn)生一個(gè)匹配的模板函數(shù)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。