《模板及其應(yīng)》PPT課件.ppt_第1頁
《模板及其應(yīng)》PPT課件.ppt_第2頁
《模板及其應(yīng)》PPT課件.ppt_第3頁
《模板及其應(yīng)》PPT課件.ppt_第4頁
《模板及其應(yīng)》PPT課件.ppt_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第十三講 模板及其應(yīng)用,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,1.函數(shù)模板的概念,通常設(shè)計(jì)的算法(處理語句)是可以處理多種數(shù)據(jù)類型的,但目前處理相同的問題,仍要分別定義多個(gè)類似的函數(shù)。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,int max (int a, int b) /求兩個(gè)整數(shù)中較大值 if(ab) return a; else return b; double max (double a, double b) /求兩個(gè)浮點(diǎn)數(shù)中較大值 if(ab) return a; else return b; char max (char a, char b) . /求兩個(gè)字符中較大值 ,例1.求兩個(gè)數(shù)據(jù)中較大值(P.300),13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,如果“提取”出一個(gè)可變化的類型參數(shù)T,就可以“綜合”成同一個(gè)函數(shù)(模板),它實(shí)際上代表著一組函數(shù):,T max (T a, T b) if(ab) return a; else return b; ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,在C+中定義完整的函數(shù)模板max時(shí),格式如下:,template T max (T a, T b) if(ab) return a; else return b; ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,2.函數(shù)模板的說明,template ,template: 關(guān)鍵字,指明為函數(shù)模板或類模板。,模板參數(shù)表:用尖括號“”括起來,一個(gè)或多個(gè)模板參數(shù),用逗號“,”分開。,模板參數(shù):class。參數(shù)名是標(biāo)識符,其對應(yīng)實(shí)參可以是系統(tǒng)預(yù)定義類型或用戶自定義類型。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,函數(shù)定義:和一般函數(shù)定義相同。 () ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,注意:,1) 應(yīng)在“返回類型”或“形參表”或“函 數(shù)體”中使用上述的“類型形參 名” 。 2) 調(diào)用處則類似于一般函數(shù),用戶 只需給出具體的實(shí)參。 3) 模板函數(shù)調(diào)用時(shí),不進(jìn)行實(shí)參到 形參類型的自動轉(zhuǎn)換。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,例2:函數(shù)模板實(shí)例一 Program 9-1.cpp (P.302),例3:函數(shù)模板實(shí)例二 Program 9-2.cpp (P.303),例4:函數(shù)模板實(shí)例三 Program 9-3.cpp (P.303-304),13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,利用類模板(帶類型參數(shù)或普通參數(shù)的類),一次就可定義出具有共性的一組類。 即,可使得所定義類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值都可以是任意類型的。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,1.類模板定義格式,template class 類模板定義體 ,template:關(guān)鍵字,指明本說明為類模板說明。,模板參數(shù)表:用尖括號“”括起來的若干個(gè)類型形參或者普通形參。說明類型形參時(shí),使用“class ”的方式。說明普通形參時(shí),使用“”的方式。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,class:關(guān)鍵字,指明定義的是類模板。,類模板名:用戶自定義標(biāo)識符。,類模板定義體:實(shí)際上是類定義體,以類模板參數(shù)作為某個(gè)類或某個(gè)類型名來使用。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,注意:,2) 利用類模板說明類對象時(shí),要隨類模板名同時(shí)給出對應(yīng)于類型形參或普通形參的具體實(shí)參(從而實(shí)例化為一個(gè)具體的類)。說明格式為: 類模板名 類型形參的相應(yīng)實(shí)參為類型名,而普通形參的相應(yīng)實(shí)參必須為常量。,1) 類定義體中應(yīng)使用上述的“類型形參名”及“普通形參名”。,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,3) 類模板的成員函數(shù)既可以在類體內(nèi)進(jìn)行說明(自動按內(nèi)聯(lián)函數(shù)處理),也可以在類體外進(jìn)行說明。 在類體外說明(定義)時(shí)使用如下格式: template 返回類型 類模板名 :函數(shù)名( 形參表 ) 函數(shù)體 ;,上述的“形參1的名字”來自于“形參1的說明”,由“甩掉”說明部分的“類型”而得,是對類型形參或普通形參的使用。而 “類模板名 :”所起的作用正是在類體外定義成員函數(shù)時(shí)在函數(shù)名前所加的類限定符!,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,例5,對具有一個(gè)類型參數(shù)T的類模板TestClass,在類體外定義其成員函數(shù)getData時(shí)的大致樣式如下: template T TestClass: getData( 形參表 ) . /函數(shù)體 ;,其中的“TestClass:”所起的作用正是在類體外定義成員函數(shù)時(shí)在函數(shù)名前所加的類限定符!,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,2.僅使用類型參數(shù)的類模板示例,例6: #include template class TestClass public: T buffer10; /T類型的數(shù)據(jù)成員buffer數(shù)組大小固定為10 (靈活性差!) T getData(int j); /獲取T類型buffer(數(shù)組)的第j個(gè)分量 ; template T TestClass:getData(int j) return *(buffer+j); ;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,void main() TestClass ClassInstA; /char取代T,從而實(shí)例化為一個(gè)具體的類 char cArr6=“abcde“; for(int i=0; i5; i+) ClassInstA.bufferi=cArri; for(i=0; i5; i+) char res=ClassInstA.getData(i); coutres“ “; coutendl;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,void main() TestClass ClassInstF; /實(shí)例化為另外一個(gè)具體的類 double fArr6=12.1, 23.2, 34.3, 45.4, 56.5, 67.6; for(i=0; i6; i+) ClassInstF.bufferi=fArri-10; for(i=0; i6; i+) double res=ClassInstF.getData(i); coutres“ “; coutendl; ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,程序執(zhí)行后的顯示結(jié)果如下: a b c d e 2.1 13.2 24.3 35.4 46.5 57.6,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,3.僅使用普通參數(shù)(非類型參數(shù))的類模板示例,例7: #include template class TestClass public: int bufferi; /使buffer的大小可變化,但其類型則固定為int(靈活性差!) int getData(int j); ; template int TestClass:getData(int j) return *(buffer+j); ;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,void main() TestClass ClassInstF; double fArr6=12.1, 23.2, 34.3, 45.4, 56.5, 67.6; for(i=0; i6; i+) ClassInstF.bufferi=fArri-10; for(i=0; i6; i+) double res=ClassInstF.getData(i); coutres“ “; coutendl; ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,程序執(zhí)行后的顯示結(jié)果如下: 2 13 24 35 46 57,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,4.同時(shí)使用類型參數(shù)和普通參數(shù)的類模板示例,例8: #include #include “string.h“ template class TestClass public: T bufferi; /T類型的buffer,其大小隨普通形參i的值變化(靈活性大!) T getData(int j); ; template T TestClass:getData(int j) return *(buffer+j); ;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,void main() TestClass ClassInstA; char cArr6=“abcde“; strcpy(ClassInstA.buffer, cArr); for(int i=0; i5; i+) char res=ClassInstA.getData(i); coutres“ “; coutendl;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,TestClass ClassInstF; double fArr6=12.1, 23.2, 34.3, 45.4, 56.5, 67.6; for(i=0; i6; i+) ClassInstF.bufferi=fArri-10; for(i=0; i6; i+) double res=ClassInstF.getData(i); coutres“ “; coutendl; ,程序執(zhí)行后的顯示結(jié)果如下: a b c d e 2.1 13.2 24.3 35.4 46.5 57.6,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,1.設(shè)計(jì)一個(gè)鏈表類模板,定義一個(gè)處理鏈表的類模板list,它含有一個(gè)類型形參T,以指出每一鏈表項(xiàng)的data數(shù)據(jù)域的類型。,例9: Program9-8.cpp (P.318),#include #include template class list struct node T data; node * next; *head, *tail;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,/* 數(shù)據(jù)成員head與tail均為指針。其中的head總指向鏈表的首項(xiàng),而tail總指向鏈表的尾項(xiàng)。每當(dāng)準(zhǔn)備往鏈表中加入一個(gè)表項(xiàng)(及其表項(xiàng)data數(shù)據(jù))時(shí),程序中首先使用“new node”來動態(tài)生成一個(gè)新的表項(xiàng)空間,并“填入”該表項(xiàng)的data數(shù)據(jù),而后通過指針的改變與關(guān)聯(lián),將該表項(xiàng)加入到以head為首以tail為尾的當(dāng)前鏈表結(jié)構(gòu)中(以形成一個(gè)更新后的鏈表)。 */,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,public: list() /構(gòu)造函數(shù),創(chuàng)建一個(gè)“空鏈表” head=tail=NULL; ; void Insert (T * item) /*動態(tài)生成鏈表項(xiàng)空間,并將item所指向的T型數(shù)據(jù)放至該項(xiàng)的data;而后將新生成的該鏈表項(xiàng)插入到原鏈的鏈?zhǔn)祝ㄦ湵淼摹皸!笔接梅ǎ?/ . ;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,void Append (T * item) /*動態(tài)生成鏈表項(xiàng)空間,并將item所指向的T型數(shù)據(jù)放入該項(xiàng)的data; 而后將新生成的該項(xiàng)附加到原鏈的鏈尾(鏈表的“隊(duì)列”式用法)。 */ . ; T get () /*取出鏈表首項(xiàng)的數(shù)據(jù)(data域值),并將該首項(xiàng)從鏈表中刪去 */ . ; ; /類模板list定義結(jié)束,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,class person public: char name20; int age; float hight; ; /* 注:若說明為“char* name;”,則主函數(shù)處要通過new為每一對象的name域申請動態(tài)空間! */ void main() person ps; list link1; list link2;,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,cout 0 - 1 - 2 - 3 - 4 link2鏈表: head - 4號人員信息 - 3號人員信息 - 2號人員信息 - 1號人員信息 - 0號人員信息 */,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,cout“ - The result -“endl; for (i=0;i5;i+) ps=link2.get(); /取出link2鏈表首項(xiàng)的人員信息 link2.Append( /輸出link2鏈表人員信息的name, /以及l(fā)ink1鏈表表項(xiàng)中的對象的順序號 ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,cout“ - The result -“endl; for (i=0;i5;i+) ps=link2.get(); /取出link2鏈表首項(xiàng)的人員信息 link2.Append( /*輸出link2鏈表人員信息的name以及l(fā)ink1鏈表表項(xiàng)中的對象的順序號 ,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,程序執(zhí)行后的顯示結(jié)果如下: - Input 5 persons information - input 0 inf(name,age,hight):zhangLi 20 1.68 input 1 inf(name,age,hight):wangyue 21 1.72 input 2 inf(name,age,hight):liming 19 1.75 input 3 inf(name,age,hight):zhaoyi 19 1.78 input 4 inf(name,age,hight):chenjin 20 1.8 - The result - chenjin 0 zhaoyi 1 liming 2 wangyue 3 zhangLi 4,13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,2.按不同方法派生出的類模板(P.314),可使用不同方法來派生類模板。例如常用如下幾種方式:,(1) 一般類(其中不使用類型參數(shù)的類)作基類。,(2) 類模板作基類(但僅基類中用到類型參數(shù)T)。,(3)類模板作基類(但基類與派生類中均用到同一個(gè)類型參數(shù)T),(4) 類模板作基類(基類中用到類型參數(shù)T2,派生類中用到類型參數(shù)T1),13.1 函數(shù)模板 13.2 類模板 13.3 類模板應(yīng)用,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論