面向?qū)ο蟮某绦蛟O(shè)計(jì)c++第六章模板演示文檔_第1頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)c++第六章模板演示文檔_第2頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)c++第六章模板演示文檔_第3頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)c++第六章模板演示文檔_第4頁(yè)
面向?qū)ο蟮某绦蛟O(shè)計(jì)c++第六章模板演示文檔_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)第六章 模板C+ Templates,楊衛(wèi)東 左崢嶸華中科技大學(xué) 自動(dòng)化學(xué)院,2017秋,參考資料,C+ primer 第四版Effective C+ 3rdC+ Templates(簡(jiǎn)體中文版).pdf,內(nèi)容,模板的定義函數(shù)模板類(lèi)模板標(biāo)準(zhǔn)模板庫(kù)STL,問(wèn)題提出,實(shí)現(xiàn)一個(gè)函數(shù),輸入2個(gè)變量,輸出這兩個(gè)變量中值比較大的元素。要求:此函數(shù)可以接受int, char以及double類(lèi)型的參數(shù)。C語(yǔ)言實(shí)現(xiàn):/函數(shù)1char MaxOfChar( char cNum1, char cNum2) return(cNum1cNum2)?cNum1:cNum2;/函數(shù)2int MaxOfInt( int iNum1, int iNum2) return(iNum1iNum2)?iNum1:iNum2;/函數(shù)3double MaxOfDouble( double dNum1, double dNum2) return(dNum1dNum2)?dNum1:dNum2;,C語(yǔ)言,函數(shù)重載,c+時(shí)代,由于存在重載的概念,所以實(shí)現(xiàn)起來(lái)應(yīng)該是這個(gè)樣子:/函數(shù)1char Max( char cNum1, char cNum2) return(cNum1cNum2)?cNum1:cNum2;/函數(shù)2int Max( int iNum1, int iNum2) return(iNum1iNum2)?iNum1:iNum2;/函數(shù)3double Max( double dNum1, double dNum2) return(dNum1dNum2)?dNum1:dNum2;#define MAX(x,y) ( (xy) ? x: y ),函數(shù)名字統(tǒng)一但代碼量沒(méi)有什么變化能否進(jìn)一步?,C+,宏定義,宏定義#define Max( Inputl, Input2) ( ( InputlInput2) ? Inputl:Input2 )宏無(wú)類(lèi)型檢查,不建議,模板(函數(shù)模板) templateT Max( const T 可以接受任何類(lèi)型的參數(shù),包括上邊提到的int, char, double,甚至任何自定義類(lèi)型(只要你實(shí)現(xiàn)了它的比較運(yùn)算符operator ) 具體選用什么樣的實(shí)際函數(shù)是在編譯時(shí)刻就決定好的,絲毫不會(huì)影響運(yùn)行時(shí)的效率,Input參數(shù)中用的是const&的,好處是減少函數(shù)調(diào)用時(shí)候的開(kāi)銷(xiāo),因?yàn)槲覀儾恢繲類(lèi)型到底有多大,模板定義,代碼重用是程序設(shè)計(jì)的重要特性,為實(shí)現(xiàn)代碼重用,使得代碼具有更好的通用性,需要代碼不受數(shù)據(jù)類(lèi)型的限制,自動(dòng)適應(yīng)不同的數(shù)據(jù)類(lèi)型,實(shí)現(xiàn)參數(shù)化程序設(shè)計(jì)。模板是C+中進(jìn)行通用程序設(shè)計(jì)的工具之一模板是C+支持參數(shù)化多態(tài)的工具,使用模板可以使用戶(hù)為類(lèi)或者函數(shù)聲明一種一般模式,使得類(lèi)中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類(lèi)型如希望函數(shù)或類(lèi)能夠處理多種不同類(lèi)型數(shù)據(jù),可以通過(guò)模板為函數(shù)或類(lèi)設(shè)計(jì)一個(gè)通用樣板(通用數(shù)據(jù)類(lèi)型),當(dāng)處理實(shí)際數(shù)據(jù)時(shí),根據(jù)給定數(shù)據(jù)的實(shí)際類(lèi)型來(lái)確定,模板是c+語(yǔ)言最強(qiáng)大卻最少被使用的特征之一,便于重復(fù)利用已經(jīng)開(kāi)發(fā)好的數(shù)據(jù)結(jié)構(gòu)和算法,可以提高代碼的復(fù)用性和開(kāi)發(fā)效率,是通用編程實(shí)現(xiàn)方法之一。 在c+中,模板讓程序員能夠定義一種使用不同類(lèi)型對(duì)象的行為。比如用模板類(lèi)定義一種鏈表,那么通過(guò)不同的模板參數(shù)(在調(diào)用時(shí)提供),可以生成不同類(lèi)型的鏈表 有點(diǎn)像宏,但是宏不是類(lèi)型安全的,而模板是類(lèi)型安全的分函數(shù)模板和類(lèi)模板兩種,模板的特點(diǎn),6.1 函數(shù)模板 1、數(shù)據(jù)類(lèi)型作為參數(shù)的背景例:求絕對(duì)值的函數(shù)int abs(int x)return x0?-x:x;double abs(double x)return x0?-x:x;特點(diǎn):算法完全相同,僅僅只是數(shù)據(jù)類(lèi)型不同。(函數(shù)重載)問(wèn)題:能否以數(shù)據(jù)類(lèi)型作為參數(shù),實(shí)現(xiàn)通用代碼設(shè)計(jì)。,2、模板模板是由可以使用任何數(shù)據(jù)類(lèi)型的通用代碼構(gòu)成。模板以數(shù)據(jù)類(lèi)型作為參數(shù)。模板的定義形式是:template 函數(shù)定義說(shuō)明:template是關(guān)鍵字,表示定義的是模板。括起來(lái)的是模板的參數(shù),可以有一個(gè)或多個(gè)。如:template 或者:template,3、例子 定義一個(gè)求絕對(duì)值函數(shù)的模板。#include template T abs(T x)return x0?-x:x;void main()int n=-5;double d=-5.5;coutabs(n)endl;/由n的類(lèi)型為int推導(dǎo)出T為intcoutabs(d)endl; /由d的類(lèi)型為double推導(dǎo)出T為double,分析:編譯器調(diào)用abs()時(shí),用其實(shí)參的類(lèi)型推導(dǎo)出函數(shù)模板的類(lèi)型參數(shù)。當(dāng)類(lèi)型參數(shù)的含義確定后,編譯器將以函數(shù)模板為樣板,生成一個(gè)函數(shù)。以abs(n)調(diào)用為例,編譯器將生成一個(gè)函數(shù):int abs(int x)return x, 2 _TD31;,舉例2矩陣,template class Matrixpublic: / constructors and destructor Matrix(); Matrix( const Matrix ,Test62_TmatrixsDemo.dsw,模板是C+支持參數(shù)化的工具使用類(lèi)模板使用戶(hù)可以為類(lèi)聲明一種模式,使類(lèi)中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能夠取任意類(lèi)型。類(lèi)模板的聲明形式如下: template 類(lèi)聲明模板參數(shù)表為:class 標(biāo)識(shí)符;如:template 模板參數(shù)表包含上面多項(xiàng)內(nèi)容時(shí),各項(xiàng)內(nèi)容以逗號(hào)分隔。模板類(lèi)的成員函數(shù)必須是函數(shù)模板,6.2 類(lèi)模板,在類(lèi)模板首部以外的成員函數(shù)定義都要以下面的形式開(kāi)頭。 template 與函數(shù)模板相同,類(lèi)模板只有使用的時(shí)候才被具體化為某一種類(lèi)型用模板類(lèi)創(chuàng)建對(duì)象的一般形式: 模板 對(duì)象名1,對(duì)象名2,對(duì)象名n; 模板參數(shù)表為用逗號(hào)分隔的若干類(lèi)型標(biāo)識(shí)符或常量表達(dá)式構(gòu)成。,6.2 類(lèi)模板,#include #include / 結(jié)構(gòu)體Studentstruct Student int id; /學(xué)號(hào) float gpa; /平均分; template /類(lèi)模板:實(shí)現(xiàn)對(duì)任意類(lèi)型數(shù)據(jù)進(jìn)行存取class Store private: T item; / item用于存放任意類(lèi)型的數(shù)據(jù) int haveValue; / haveValue標(biāo)記item是否已被存入內(nèi)容 public: Store(void); / 缺省形式(無(wú)形參)的構(gòu)造函數(shù) T GetElem(void); /提取數(shù)據(jù)函數(shù) void PutElem(T x); /存入數(shù)據(jù)函數(shù);,舉例,/以下實(shí)現(xiàn)各成員函數(shù)。/注意:模板類(lèi)的成員函數(shù),若在類(lèi)外實(shí)現(xiàn),則必須是模板函數(shù)/ 缺省形式構(gòu)造函數(shù)的實(shí)現(xiàn)template Store:Store(void): haveValue(0) / 提取數(shù)據(jù)函數(shù)的實(shí)現(xiàn)template T Store:GetElem(void) / 如果試圖提取未初始化的數(shù)據(jù),則終止程序 if (haveValue = 0) cout No item present! endl; exit(1); return item; / 返回item中存放的數(shù)據(jù) ,/ 存入數(shù)據(jù)函數(shù)的實(shí)現(xiàn) template void Store:PutElem(T x) haveValue+; / 將haveValue 置為 TRUE,表示item中已存入數(shù)值 item = x; / 將x值存入itemvoid main(void) Student g= 1000, 23; /定義Student類(lèi)型結(jié)構(gòu)體變量的同時(shí)賦以初值 Store S1, S2; /定義兩個(gè)Store類(lèi)對(duì)象,其中數(shù)據(jù)成員item為int類(lèi)型 Store S3;/定義Store類(lèi)對(duì)象S3,其中數(shù)據(jù)成員item為Student類(lèi)型,Store D; /定義Store類(lèi)對(duì)象D,其中數(shù)據(jù)成員item為double類(lèi)型 S1.PutElem(3); /向?qū)ο骃1中存入數(shù)據(jù)(初始化對(duì)象S1) S2.PutElem(-7); /向?qū)ο骃2中存入數(shù)據(jù)(初始化對(duì)象S2) cout S1.GetElem() S2.GetElem() endl; /輸出對(duì)象S1和S2的數(shù)據(jù)成員 S3.PutElem(g); /向?qū)ο驞中存入數(shù)據(jù)(初始化對(duì)象D) cout The student id is S3.GetElem().id endl;/輸出對(duì)象S3的數(shù)據(jù)成員 /D.PutElem(6.5); cout Retrieving object D ;cout D.GetElem() item2 ? item1: item2; maxitem=maxitemitem3? maxitem: item3; return maxitem;#endif/EXAMPLE9_1.CPP/主程序#include #include EXAMPLE901.H#include EXAMPLE901B.Hvoid main() Max nmyMax(1,2,3); Max dblmyMax(1.2,1.3,-1.4); coutnmyMax.GetMaxItem()endl; coutdblmyMax.GetMaxItem()ptrNext; /一般情況 return ptrTemp;/鏈表類(lèi)構(gòu)造函數(shù),4個(gè)私有指針成員設(shè)置為空,鏈表初始長(zhǎng)度設(shè)置為0,初始當(dāng)前結(jié)點(diǎn)/初始位置為-1templateLinkedList:LinkedList(void):ptrFront(NULL),ptrTail(NULL), ptrPrev(NULL),ptrCurr(NULL),nListLength(0),nPosition(-1) /重載=號(hào)運(yùn)算符templateLinkedList& LinkedList:operator=(const LinkedList& list),if(this!=,if(!ptrFront) /如果當(dāng)前指針為空,鏈表為空直接返回 return; if(nPos=nListLength|nPosNextListNode(); ptrPrev=ptrFront; nStartPos=1; for(nPosition=nStartPos;nPosition!=nPos;nPosition+) /尋找該位置并使當(dāng)前指針指向該位置, ptrPrev=ptrCurr; ptrCurr=ptrCurr-NextListNode(); /當(dāng)前指針指向當(dāng)前結(jié)點(diǎn)的后續(xù)結(jié)點(diǎn)templatevoid LinkedList:Next() if(ptrCurr) ptrPrev=ptrCurr; ptrCurr=ptrCurr-NextListNode(); nPosition+; /將數(shù)據(jù)為nItem的結(jié)點(diǎn)插入到鏈表頭template,void LinkedList:InsertFront(const T,newListNode=GetListNode(nItem); ptrCurr-InsertAfter(newListNode); /將數(shù)據(jù)為nItem的結(jié)點(diǎn)插入到鏈表的當(dāng)前位置之前templatevoid LinkedList:InsertAt(const T else /一般情況 ,newListNode=GetListNode(nItem); ptrPrev-InsertAfter(newListNode); if(ptrPrev=ptrTail) ptrTail=newListNode; nPosition=nListLength; ptrCurr=newListNode; /將數(shù)據(jù)為nItem的結(jié)點(diǎn)插入到鏈表當(dāng)前結(jié)點(diǎn)之后templatevoid LinkedList:InsertAfter(const T if(!ptrCurr) /處理空鏈表的情況 ,newListNode=GetListNode(nItem); ptrCurr=newListNode; ptrFront=ptrCurr; else /一般情況 newListNode=GetListNode(nItem); ptrCurr-InsertAfter(newListNode); if(ptrPrev=ptrTail) ptrTail=newListNode; nPosition=nListLength; ptrCurr=newListNode; nListLength+;/刪除鏈表中的當(dāng)前結(jié)點(diǎn)templatevoid LinkedList:DeleteCurr(), ListNode *ptr; if(!ptrCurr) /處理空鏈表的情況 cerrNextListNode(); else /一般情況 ptr=ptrPrev-DeleteAfter(); if(ptr=ptrTail) ptrTail=ptrPrev; nPosition-; ptrCurr=ptr-NextListNode(); FreeListNode(ptr);,nListLength-;/刪除鏈表中所有結(jié)點(diǎn)并釋放資源templatevoid LinkedList:DeleteAll() ListNode *ptrCurrPos, *ptrNextPos; ptrCurrPos=ptrFront; while(ptrCurrPos) /循環(huán)處理刪除鏈表中的各個(gè)結(jié)點(diǎn) ptrNextPos=ptrCurrPos-NextListNode(); FreeListNode(ptrCurrPos); ptrCurrPos=ptrNextPos; ptrFront=NULL; ptrTail=NULL; ptrPrev=NULL; ptrCurr=NULL;,nListLength=0; nPosition=-1;/刪除鏈表的頭結(jié)點(diǎn)templateint LinkedList:DeleteHead() ListNode *ptr=ptrFront; if(ptrFront) ptrFront=ptrFront-NextListNode(); delete ptr; nListLength-; return 1; else /處理鏈表為空的情況 coutThe List is empty!ShowDate(); ptr=ptr-NextListNode(); if(nPosition=-1) /list為空 return; ptrPrev=NULL; ptrCurr=ptrFront; for(int nPos=0;nPos!=list.CurrPosition();nPos+) /將新鏈表的各個(gè)數(shù)據(jù)成員設(shè)置與原鏈表相同 ptrPrev=ptrCurr; ptrCurr=ptrCurr-NextListNode(); nPosition=nPos; nListLength=list.ListLength();,/獲得下一個(gè)新結(jié)點(diǎn),返回新結(jié)點(diǎn)地址templateListNode *LinkedList:GetListNode(const T,ptrCurr=ptrCurr-NextListNode(); /在鏈表中查找數(shù)據(jù)templateint LinkedList:Find(T/刪除鏈表中滿(mǎn)足條件的結(jié)點(diǎn)template,void LinkedList:Delete(T key) ptrCurr=ptrFront; ptrPrev=NULL; if(!ptrCurr) return; while(ptrCurr /在排序鏈表中插入新結(jié)點(diǎn)構(gòu)成新的排序鏈表,templatevoid LinkedList:InsertOrder(T nItem) ListNode *newListNode, *next

溫馨提示

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

評(píng)論

0/150

提交評(píng)論