二級ncre電子第九章_第1頁
二級ncre電子第九章_第2頁
二級ncre電子第九章_第3頁
二級ncre電子第九章_第4頁
二級ncre電子第九章_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章模板主要內(nèi)容函數(shù)模板類模板29.1函數(shù)模板模板的作用:數(shù)組累加的例子

函數(shù)addTo將數(shù)組a的各個元素值分別累加到數(shù)組b的對應(yīng)單元中,但數(shù)組的類型限定為intvoidaddTo(inta[],intb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}為了解決其他類型數(shù)組的累加問題,就不得不重載代碼幾乎相同的許多addTo版本,每個版本僅適用于一種類型voidaddTo(longa[],longb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}

voidaddTo(floata[],floatb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}

voidaddTo(doublea[],doubleb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}39.1函數(shù)模板模板的作用:數(shù)組累加的例子

上述做法維護(hù)所有代碼的一致性很困難。如果發(fā)現(xiàn)錯誤需要修改,必須一一修改所有的重載函數(shù),并且必須修改一致解決這一問題的方法就是使用函數(shù)模板。函數(shù)模板是一系列相關(guān)函數(shù)的模型或樣板,這些函數(shù)的源代碼形式相同,只是所針對的數(shù)據(jù)類型不同。對于函數(shù)模板,數(shù)據(jù)類型本身成了它的參數(shù),因而是一種參數(shù)化類型的函數(shù)49.1函數(shù)模板函數(shù)模板的聲明template<<模板形參表>><函數(shù)聲明><模板形參表>由一個或多個<模板形參>組成,多個<模板形參>之間以用逗號分隔每個<模板形參>具有下面幾種形式typename<參數(shù)名>class<參數(shù)名><類型修飾><參數(shù)名>其中<參數(shù)名>可以是任意的標(biāo)識符。前兩種是等價的,用<類型修飾>聲明的參數(shù)則稱為常規(guī)參數(shù),在形式上與普通的函數(shù)參數(shù)聲明相同59.1函數(shù)模板函數(shù)模板的聲明addTo模板可以定義為:template<classT>

voidaddTo(Ta[],Tb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}用<和>括起來的部分就是模板形參表,T是一個虛擬類型參數(shù)69.1函數(shù)模板函數(shù)模板的實(shí)例化定義好函數(shù)模板后,編譯系統(tǒng)會依據(jù)每一次對函數(shù)模板調(diào)用時實(shí)際所使用的數(shù)據(jù)類型生成適當(dāng)?shù)恼{(diào)用代碼,并生成相應(yīng)的函數(shù)版本,即模板函數(shù)編譯系統(tǒng)生成函數(shù)模板的某個具體函數(shù)版本的過程稱為函數(shù)模板的實(shí)例化每一個實(shí)例就是一個函數(shù)定義在實(shí)例化過程中用實(shí)參的實(shí)際類型(如int、long等)取代虛擬類型(如T)79.1函數(shù)模板函數(shù)模板的實(shí)例化例如,編譯系統(tǒng)在處理longdoublex[]={1,2,3,4,5},y[]={6,7,8,9,10};addTo(x,y,5);時,會生成如下函數(shù)實(shí)例:voidaddTo(longdoublea[],longdoubleb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}在處理unsignedx[]={1,2,3,4,5,6,7,8,9},

y[]={22,33,,44,55,66,77,88,99,11};

addTo(x,y,9);時,會生成如下函數(shù)實(shí)例:voidaddTo(unsigneda[],unsignedb[],intsize){

for(inti=0;i<size;i++)b[i]+=a[i];

}89.1函數(shù)模板虛擬類型參數(shù)所對應(yīng)的實(shí)際類型的獲得可以從模板實(shí)參表(用<和>括起來的參數(shù)表)或從模板函數(shù)實(shí)參表(用(和)括起來的參數(shù)表)獲得模板實(shí)參的信息優(yōu)先于函數(shù)實(shí)參的信息如果從函數(shù)實(shí)參獲得的信息已經(jīng)能夠判定其中部分或全部虛擬類型參數(shù)所對應(yīng)的實(shí)際參數(shù),而且它們又正好是參數(shù)表中最后的若干參數(shù),則模板實(shí)參表中的那幾個參數(shù)可以省略。如果模板實(shí)參表中的實(shí)參都被省略了,則連空表<>也可以不要若x和y都是unsigned型,則addTo<unsigned>(x,y,9)、addTo<>(x,y,9)和addTo(x,y,9)三者是等價的99.2類模板類模板一系列相關(guān)類的模型或樣板這些類的成員組成相同,成員函數(shù)的源代碼形式相同所不同的只是針對的類型(成員的類型以及成員函數(shù)的參數(shù)和返回值的類型)不同數(shù)據(jù)類型本身成了它的參數(shù),因而是一種參數(shù)化類型的類,是類的生成器類模板中聲明的類稱為模板類109.2類模板類模板的使用聲明一個類模板的格式是:template<<模板形參表>><類聲明><模板形參表>由一個或多個模板形參組成;與一般類聲明的不同之處在于,這里的<類聲明>要用<模板形參表>中聲明的虛擬類型參數(shù)來修飾它的某些成員,使模板類獨(dú)立于任何具體的數(shù)據(jù)類型。在模板外定義的成員函數(shù)是一個函數(shù)模板,其定義格式是:template<模板形參表>

<返回類型><類名><<模板形參表>>::<函數(shù)名>(<函數(shù)形參表>)<函數(shù)體>注意:類模板的成員函數(shù)都是模板函數(shù),因此在模板外定義成員函數(shù)的格式與定義普通模板函數(shù)十分相似。119.2類模板類模板的使用用類模板定義對象的格式是:<類名><<模板實(shí)參表>><對象名>;或<類名><<模板實(shí)參表>><對象名>(<構(gòu)造函數(shù)實(shí)參表>);129.2類模板例?9.1分析下列程序的輸出結(jié)果。template<typenameTYPE>//類模板聲明以此開頭classArray{int_size;TYPE*data//區(qū)分不同類模板實(shí)例的有關(guān)類型應(yīng)使用虛擬類型public:Array(intn);~Array(){delete[]data;}TYPE&operator[](inti);intsize()const{return_size;}};139.2類模板例?9.1(續(xù))template<typenameTYPE>//類模板的成員函數(shù)的聲明以此開頭Array<TYPE>::Array(intn){//在類模板聲明之外,Array與<TYPE>if(n<1){//必須捆綁在一起出現(xiàn)。cout<<"Errordimensiondescription";exit(1);}_size=n;data=newTYPE[_size];}template<typenameTYPE>TYPE&Array<TYPE>::operator[](inti){if(i<1||i>_size){cout<<endl<<"Subscriptoutofrange";delete[]data;exit(2);}returndata[i-1];}149.2類模板例?9.1(續(xù))intmain(){Array<int>a(5);inti;for(i=1;i<=a.size();i++)a[i]=i;for(i=1;i<=a.size();i++)cout<<setw(5)<<a[i];cout<<endl<<endl;Array<double>b(5);for(i=1;i<=b.size();i++)b[i]=i+i/10.0;cout.precision(2);for(i=1;i<=b.size();i++)cout<<setw(5)<<b[i]<<'';cout<<endl<<endl;return0;}159.2類模板例?9.1(續(xù))輸出結(jié)果123451.12.23.34.45.516本章小結(jié)聲明一個函數(shù)模板的格式是:

template<<模板形參表>><函數(shù)聲明>聲明一個類模板的格式是:

template<<模板形參表>><類聲明>在調(diào)用模板函

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論