《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第7章 模板_第1頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第7章 模板_第2頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第7章 模板_第3頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第7章 模板_第4頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第7章 模板_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

第7章模板7.1函數(shù)模板7.2模板函數(shù)的覆蓋7.3類模板7.1函數(shù)模板1.問(wèn)題的提出重載函數(shù)可以解決功能相同或相似的函數(shù)使用同一個(gè)函數(shù)名的問(wèn)題。

voidswap(char&x,char&y){chart=x;x=y;y=t;}voidswap(int&x,int&y){intt=x;x=y;y=t;}第7章模板voidswap(float&x,float&y){floatt=x;x=y;y=t;}

實(shí)際代碼量并未減少??墒褂煤瘮?shù)模板減少大量代碼。7.1函數(shù)模板2.函數(shù)模板的定義

template<classT>或類型名函數(shù)名(參數(shù)表){

函數(shù)體}

函數(shù)模板就像是一個(gè)帶有類型參數(shù)的函數(shù)(參數(shù)T即為類型),編譯程序會(huì)根據(jù)實(shí)際參數(shù)的類型確定參數(shù)的類型。第7章模板template<typenameT>類型名函數(shù)名(參數(shù)表){ 函數(shù)體}例7.1定義用于變量交換的函數(shù)模板#include<iostream>usingnamespacestd;template<classT>voidswap(T&x,T&y){ Ttemp=x; x=y; y=temp;}voidmain(void){ chara='A',b='B'; intc=123,d=456; doublex=12.3,y=45.6; swap(a,b); swap(c,d); swap(x,y); cout<<a<<","<<b<<endl; cout<<c<<","<<d<<endl; cout<<x<<","<<y<<endl;}第7章模板程序運(yùn)行結(jié)果為:B,A456,12345.6,12.3T本身是一個(gè)類型參數(shù),在調(diào)用函數(shù)swap()時(shí),編譯程序會(huì)根據(jù)實(shí)際參數(shù)的類型確定T的類型。

例7.2插入排序函數(shù)模板,使用插入排序函數(shù)模板可以為不同數(shù)據(jù)類型的數(shù)組排序,如整型、字符型、實(shí)型等等,為了使程序具有通用性,設(shè)計(jì)函數(shù)模板InsertionSort()。插入排序的基本思想:每一步將一個(gè)待排序的元素按其關(guān)鍵字值的大小插入到已排序序列的合適位置,直到待排序元素全部插入完為止。第7章模板例7.2(續(xù)一)template<classT>voidInsertionSort(TA[],intn){inti,j;Ttemp;for(i=1;i<n;i++){

//從A[i-1]開(kāi)始向A[0]方向掃描各元素,尋找適當(dāng)位置插入A[i]

j=i; temp=A[i]; while(j>0&&temp<A[j-1]) {

//當(dāng)遇到temp>=A[j-1]結(jié)束循環(huán)時(shí),j便是應(yīng)插入的位置

//當(dāng)遇到j(luò)==0結(jié)束循環(huán)時(shí),則0是應(yīng)插入的位置。

A[j]=A[j-1];//將元素逐個(gè)后移,以便找到插入位置時(shí)可立即插入。

j--;}A[j]=temp;}}第7章模板例7.2(續(xù)二)#include<iostream>usingnamespacestd;voidmain(){inta[10]={2,4,1,8,7,9,0,3,5,6};doubleb[10]={12.1,24.2,15.5,81.7,2.7,5.9,40.3,33.3,25.6,4.6};InsertionSort(a,10);InsertionSort(b,10);cout<<a[0]<<""<<a[1]<<""<<a[2]<<""<<a[3]<<"";cout<<a[4]<<""<<a[5]<<""<<a[6]<<""<<a[7]<<"";cout<<a[8]<<""<<a[9]<<endl;cout<<b[0]<<""<<b[1]<<""<<b[2]<<""<<b[3]<<"";cout<<b[4]<<""<<b[5]<<""<<b[6]<<""<<b[7]<<"";cout<<b[8]<<""<<b[9]<<endl;}

第7章模板程序運(yùn)行結(jié)果為:01234567892.74.65.912.115.524.225.633.340.381.7

例7.3使用函數(shù)模板產(chǎn)生的二意性#include<iostream>usingnamespacestd;template<classT>Tmax(Ta,Tb){ returna>b?a:b;}voidmain(void){ inta=max(10.5,20); doubleb=max(10,20.6); cout<<a<<endl; cout<<b<<endl;}

第7章模板產(chǎn)生二意性,系統(tǒng)不能確定將其中的一個(gè)參數(shù)由整數(shù)轉(zhuǎn)化為實(shí)數(shù),還是應(yīng)該將另一個(gè)參數(shù)由實(shí)數(shù)轉(zhuǎn)化為整數(shù)。可使用強(qiáng)制類型轉(zhuǎn)換解決:inta=max((int)10.5,20);doubleb=max((double)10,20.6);

返回7.2模板函數(shù)的覆蓋下列函數(shù)模板:template<classT>Tmax(Ta,Tb){

retuma>b?a:b;}對(duì)于簡(jiǎn)單的數(shù)據(jù)類型,如整型、實(shí)型、字符型數(shù)據(jù),這個(gè)模板能夠正常工作。對(duì)于字符串,用上述模板就會(huì)出現(xiàn)問(wèn)題,因?yàn)閷?duì)于字符串,不能使用運(yùn)算符“>”,要為其編寫?yīng)毩⒌膍ax()函數(shù)。我們將函數(shù)模板生成的函數(shù)稱為模板函數(shù)。如果某一函數(shù)的函數(shù)原型與函數(shù)模板生成的函數(shù)(模板函數(shù))原型一致,稱該函數(shù)為模板函數(shù)的覆蓋函數(shù)。第7章模板例7.4模板函數(shù)的覆蓋#include<string>#include<iostream>usingnamespacestd;template<classT>Tmax(Ta,Tb){ returna>b?a:b;}char*max(char*x,char*y){ returnstrcmp(x,y)>0?x:y;}voidmain(void){ char*p="ABCD",*q="EFGH"; p=max(p,q); inta=max(10,20); floatb=max(10.5,20.6); cout<<p<<endl; cout<<a<<endl; cout<<b<<endl;}第7章模板程序運(yùn)行結(jié)果為:EFGH2020.67.2模板函數(shù)的覆蓋在進(jìn)行函數(shù)調(diào)用時(shí),編譯程序采用如下策略確定調(diào)用哪個(gè)函數(shù):(1)首先尋找一個(gè)實(shí)參與形參完全匹配的覆蓋函數(shù),如果找到,則調(diào)用該函數(shù).(2)如果能通過(guò)函數(shù)模板生成實(shí)例函數(shù),并且參數(shù)匹配,則調(diào)用該函數(shù)。(3)通過(guò)強(qiáng)制類型轉(zhuǎn)換,尋找能夠與實(shí)參匹白的覆蓋函數(shù),或通過(guò)函數(shù)模板生成的實(shí)例函數(shù)、如果找到則調(diào)用該函數(shù)。(4)如果所有努力失敗,則給出出錯(cuò)信息。第7章模板

返回7.3類模板1.問(wèn)題的提出classA{inti;public:A(inta){…}voidset(intb){……}…};classB{doublei;public:B(doublea){…}voidset(doubleb){……}…};第7章模板對(duì)應(yīng)的類模板:template<classT>classA{Ti;public:A(Ta){…}voidset(Tb){……}…};這兩個(gè)類的方法都一樣,只是一個(gè)數(shù)據(jù)類型是整型,另一個(gè)數(shù)據(jù)類型是實(shí)型??梢允褂妙惸0搴?jiǎn)化代碼

類模板也稱為參數(shù)化的類,用于為類型相似的類定義一種通用模式7.3類模板2.類模板的定義

template<模板參數(shù)表>class類模板名{

成員聲明}如果需要在類模板外定義類模板的成員函數(shù),格式如下:

template<模板參數(shù)表>類型類模板名<參數(shù)>::函數(shù)名(參數(shù)表){函數(shù)體}

第7章模板7.3類模板2.類模板的定義(續(xù))使用類模板建立對(duì)象的語(yǔ)法如下:

類模板<實(shí)參表>

對(duì)象1,對(duì)象2,…;系統(tǒng)會(huì)根據(jù)實(shí)參的類型,生成一個(gè)類(稱為模板類),然后建立該類的對(duì)象。即對(duì)模板實(shí)例化生成類,再對(duì)類實(shí)例化生成對(duì)象。第7章模板例7.5定義數(shù)組類的類模板,并利用成員函數(shù)對(duì)數(shù)組中的元素初始化。#include<iostream>usingnamespacestd;template<classT>classmyArray{public: myArray(intnSize,TInitVal); ~myArray() { delete[]m_pArray; } T&operator[](intnIndex)//重載運(yùn)算符[]用于取得數(shù)組的元素 { returnm_pArray[nIndex]; } voidShow(intnNumElems,char*pszMsg="",boolbOneLine=true); voidSort(intnNumElems);protected: T*m_pArray;//保存數(shù)組起始地址 intm_nSize;//數(shù)組的長(zhǎng)度};第7章模板例7.5(續(xù)一)template<classT>myArray<T>::myArray(intnSize,TInitVal){ m_nSize=(nSize>1)?nSize:1; m_pArray=newT[m_nSize]; for(inti=0;i<m_nSize;i++) m_pArray[i]=InitVal;}

template<classT>voidmyArray<T>::Show(intnNumElems,char*pszMsg,boolbOneLine){ cout<<pszMsg<<endl; if(bOneLine) { for(inti=0;i<nNumElems;i++) cout<<m_pArray[i]<<''; cout<<endl; } else { for(inti=0;i<nNumElems;i++) cout<<m_pArray[i]<<endl; }}

第7章模板構(gòu)造函數(shù)為m_nSize賦值,并為數(shù)組申請(qǐng)存儲(chǔ)空間,將數(shù)組的每個(gè)元素都賦值為InitVal。

成員函數(shù)Show()顯示數(shù)組元素的值,元素的個(gè)數(shù)由第一個(gè)參數(shù)指定,第二個(gè)參數(shù)為輸出數(shù)組元素值之前,輸出的提示信息,第三個(gè)參數(shù)確定數(shù)組元素是顯示在一行上,還是多行。

例7.5(續(xù)二)template<classT>voidmyArray<T>::Sort(intnNumElems){ inti,j; Ttemp; for(i=1;i<nNumElems;i++) { j=i; temp=m_pArray[i]; while(j>0&&temp<m_pArray[j-1]) { m_pArray[j]=m_pArray[j-1]; j--; }m_pArray[j]=temp;}}第7章模板成員函數(shù)Sort()使用插入排序法對(duì)數(shù)組元素排序(升序),其參數(shù)是數(shù)組中元素的個(gè)數(shù)。

例7.5(續(xù)三)voidmain(){ intnArr[10]={89,34,32,47,15,81,78,36,63,83}; intcArr[10]={'C','W','r','Y','k','J','X','Z','y','s'}; myArray<int>IntegerArray(10,0); myArray<char>CharArray(10,''); for(inti=0;i<10;i++) IntegerArray[i]=nArr[i]; for(i=0;i<10;i++) CharArray[i]=cArr[i]; IntegerArray.Show(10,"Unsortedarrayis:"); IntegerArray.Sort(10); IntegerArray.Show(10,"Sortedarrayis:"); cout<<endl; CharArray.Show(10,"Unsortedarrayis:"); CharArray.Sort(10); CharArray.Show(10,"Sortedarrayis:"); cout<<endl;}

第7章模板定義了兩個(gè)類模板對(duì)象,分別為int型和char型,數(shù)組元素分別被初始化為0和空格程序運(yùn)行結(jié)果為:Unsortedarrayis:89343247158178366383Sortedarrayis:15323436476378818389Unsortedarrayis:CWrYkJXZysSortedarrayis:CJWXYZkrsy例7.6使用缺省參數(shù)定義數(shù)組的類模板#include<iostream>usingnamespacestd;template<classT=int>classArray{ T*data; intsize;public: Array(int); ~Array(); T&operator[](int);};

第7章模板template<classT>Array<T>::Array(intn){ data=newT[size=n];}template<classT>Array<T>::~Array(){ deletedata;}template<classT>T&Array<T>::operator[](inti){ returndata[i];}注意:函數(shù)模板不能定義缺省參數(shù),而類模板卻可以定義缺省參數(shù)。例7.6(續(xù))voidmain(void){ inti;

Array<>L1(10);

//等價(jià)于Array<int>L1(10) Array<char>L2(20); for(i=0;i<10;i++) L1[i]=i; for(i=0;i<20;i++) L2[i]='A'+i; for(i=0;i<10;i++) cout<<L1[i]<<""; cout<<endl; for(i=0;i<20;i++) cout<<L2[i]<<""; cout<<endl;}第7章模板程序運(yùn)行結(jié)果為:0123456789ABCDEFGHIJKLMNOPQRST

例7.7折半查找函數(shù)模板第7章模板基本思想:對(duì)于已按關(guān)鍵字排序的序列,經(jīng)過(guò)一次比較,可將序列分割成兩部分,然后只在有可能包含待查元素的一部分中繼續(xù)查找,并根據(jù)試探結(jié)果繼續(xù)分割,逐步縮小查找范圍,直至找到或找不到為止。比如在如下數(shù)組中查找值為48的元素:

例7.7(續(xù)一)template<classT>intBinSearch(Tlist[],intn,Tkey){ intmid,low,high; Tmidvalue; low=0; high=n-1; while(low<=high)//low<=high表示整個(gè)數(shù)組尚未查找完

{ mid=(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論