版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、泛型程序設計與模板,C++程序設計任建吉,函數(shù)模板,Generic Programming (泛型程序設計)算法實現(xiàn)時不指定具體要操作的數(shù)據(jù)的類型 泛型 — 算法實現(xiàn)一遍 適用于多種數(shù)據(jù)結(jié)構(gòu) 優(yōu)勢: 減少重復代碼的編寫 大量編寫模板, 使用模板的程序設計 ? 函數(shù)模板? 類模板,函數(shù)模板,為了交換兩個int變量的值, 需要編寫如下Swap函數(shù): void Swap(int & x, int & y)
2、{ int tmp = x; x = y;y = tmp; },函數(shù)模板,為了交換兩個double型變量的值, 還需要編寫如下Swap 函數(shù): void Swap(double & x, double & y) { double tmp = x; x = y;y = tmp; },能否只寫一個Swap, 就 能交換各種類型的變量?,函數(shù)模板,用 函數(shù)模板 解決template 返回值類型 模
3、板名 (形參表) { 函數(shù)體 },函數(shù)模板,交換兩個變量值的函數(shù)模板 template void Swap(T & x, T & y) { T tmp = x; x = y;y = tmp; },函數(shù)模板,函數(shù)模板定義,編譯器由模板自動生成函數(shù)的過程,稱為模板的實例化。由模板實例化而得到的函數(shù),稱之為模板函數(shù),函數(shù)模板,函數(shù)模板中可以有不止一個類型參數(shù) template T2 print(T
4、1 arg1, T2 arg2){ cout<< arg1 << " "<< arg2<<endl; return arg2; },函數(shù)模板,求數(shù)組最大元素的MaxElement函數(shù)模板 template T MaxElement(T a[], int size) //size是數(shù)組元素個數(shù) { T tmpMax = a[0];for( int
5、i = 1; i < size; ++i ) if( tmpMax < a[i] ) tmpMax = a[i]; return tmpMax; },函數(shù)模板,函數(shù)模板可以重載, 只要它們的形參表不同即可 例, 下面兩個模板可以同時存在: template void print(T1 arg1, T2 arg2) { coutvoid print(T arg1, T arg2) { cout<&
6、lt; arg1 << " "<< arg2<<endl; },函數(shù)模板,C++編譯器遵循以下優(yōu)先順序:Step 1: 先找參數(shù)完全匹配的普通函數(shù)(非由模板實例化而得的函數(shù))Step 2: 再找參數(shù)完全匹配的模板函數(shù) Step 3: 再找實參經(jīng)過自動類型轉(zhuǎn)換后能夠匹配的普通函數(shù) Step 4: 上面的都找不到, 則報錯,函數(shù)模板,例: 函數(shù)模板調(diào)用順序 template
7、 T Max(T a, T b){ cout T Max(T a, T2 b){ cout << "Template Max 2" <<endl; return 0; },函數(shù)模板,函數(shù)模板,賦值兼容原則引起函數(shù)模板中類型參數(shù)的二義性templateT myFunction(T arg1, T arg2) {cout<<arg1<<“ ”&l
8、t;<arg2<<“\n”;return arg1; }...myFunction(5, 7); //ok: replace T with intmyFunction(5.8, 8.4); //ok: replace T with doublemyFunction(5, 8.4); //error: replace T with int or double? 二義性,函數(shù)模板,可以在函數(shù)模板中使用多個類型
9、參數(shù), 可以避免二義性 templateT1 myFunction( T1 arg1, T2 arg2) { cout<<arg1<<“ ”<<arg2<<“\n”; return arg1; } ...myFunction(5, 7); //ok:replace T1 and T2 with int myFunction(5.8, 8.4); //ok: replace T
10、1 and T2 with double myFunction(5, 8.4); //ok: replace T1 with int, T2 with double,類模板,類模板,類模板,對于這些數(shù)組類? 除了元素的類型不同之外, 其他的完全相同類模板? 在定義類的時候給它一個/多個參數(shù) ? 這個/些參數(shù)表示不同的數(shù)據(jù)類型在調(diào)用類模板時, 指定參數(shù), 由編譯系統(tǒng)根據(jù)參數(shù)提供 的數(shù)據(jù)類型自動產(chǎn)生相應的模板類,類模板定義,C+
11、+的類模板的寫法如下: template class 類模板名{ 成員函數(shù)和成員變量 }; 類型參數(shù)表的寫法就是:class 類型參數(shù)1, class 類型參數(shù)2, ...,類模板定義,類模板里的成員函數(shù), 如在類模板外面定義時, template 返回值類型 類模板名::成員函數(shù)名(參數(shù)表) { ...... },類模板定義,用類模板定義對象的寫法如下:類模板名 對象名(構(gòu)造函數(shù)實際參數(shù)表); 如果類模板
12、有無參構(gòu)造函數(shù), 那么也可以只寫: 類模板名 對象名;,類模板定義,Pair類模板:template class Pair{ public:T1 key; //關鍵字T2 value; //值Pair(T1 k,T2 v):key(k),value(v) { };bool operator & p) const; };templatebool Pair::operator & p) c
13、onst//Pair的成員函數(shù) operator <{ return key < p.key; },類模板定義,Pair類模板使用:int main(){ Pair student("Tom",19); //實例化出一個類 Paircout << student.key << " " << student.value; retur
14、n 0; },輸出結(jié)果:Tom 19,使用類模板聲明對象,編譯器由類模板生成類的過程叫類模板的實例化 ? 編譯器自動用具體的數(shù)據(jù)類型 替換類模板中的類型參數(shù), 生成模板類的代碼 由類模板實例化得到的類叫模板類? 為類型參數(shù)指定的數(shù)據(jù)類型不同, 得到的模板類不同,使用類模板聲明對象,同一個類模板的兩個模板類是不兼容的 Pair * p; Pair a; p = & a; //wrong,函數(shù)模版作為類模板成員
15、,#include using namespace std; template class A{ public:templatevoid Func(T2 t) { cout a;a.Func('K'); //成員函數(shù)模板 Func被實例化 return 0; },程序輸出:K,若函數(shù)模板改為template void Func(T t){cout<<t}將報錯 “decl
16、aration of ‘class T’ shadows template parm ‘class T’,類模板與非類型參數(shù),類模板的參數(shù)聲明中可以包括非類型參數(shù) template ? 非類型參數(shù): 用來說明類模板中的屬性 ? 類型參數(shù): 用來說明類模板中的屬性類型, 成員操作 的參數(shù)類型和返回值類型,類模板與非類型參數(shù),類模板的 “” 中可以出現(xiàn)非類型參數(shù): template class CArray{ T array[
17、size]; public: void Print( ) { for(int i = 0; i < size; ++i) cout << array[i] << endl; } };,類模板與非類型參數(shù),CArray a2; CArray a3; 注意: CArray和CArray完全是兩個類 這兩個類的對象之間不能互相賦值,類模板與繼承,類模板派生出類模板 模板類 (即類模板中類型/
18、非類型參數(shù)實例化后的類) 派生出類模板 普通類派生出類模板 模板類派生出普通類,(1) 類模板從類模板派生,(2) 類模板從類模板派生,template classA{ T1v1;T2v2; };template class B:public A { T v; }; int main() { B obj1; return 0;} 自動生成兩個模板類:A和B,(3) 類模板從普通類派生,class A { int v1; };
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教案模板 算法與程序設計
- 泛型程序設計的范疇論模型研究及其應用.pdf
- 支持泛型程序設計的Apla-Java自動程序轉(zhuǎn)換系統(tǒng).pdf
- 支持泛型程序設計的APLA-Delphi自動程序轉(zhuǎn)換系統(tǒng).pdf
- 隱藏型后門程序設計與實現(xiàn).pdf
- 程序設計綜合實驗期末報告(模板)
- 算法與程序設計
- 算法與程序設計
- vb程序設計例題-程序改錯程序填空程序設計
- 第1單元程序與程序設計
- 第1單元程序與程序設計
- 程序設計教案 程序設計——數(shù)據(jù)結(jié)構(gòu)
- c語言程序設計實驗與習題指導課后程序設計答案
- 問題求解與程序設計
- 最簡單的c程序設計――順序程序設計
- 自動程序設計
- 894程序設計
- 程序設計實習
- android程序設計
- 程序設計類
評論
0/150
提交評論