C C++語言程序的設(shè)計(jì)第13章 模板_第1頁
C C++語言程序的設(shè)計(jì)第13章 模板_第2頁
C C++語言程序的設(shè)計(jì)第13章 模板_第3頁
C C++語言程序的設(shè)計(jì)第13章 模板_第4頁
C C++語言程序的設(shè)計(jì)第13章 模板_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第1313章章 模模 板板 2021-12-262021-12-26l求兩個(gè)數(shù)據(jù)中最小值的函數(shù)min()的實(shí)現(xiàn)過程。其中,a和b可以是整型、實(shí)型,當(dāng)然也可以是用戶定義的數(shù)據(jù)類型。C+是強(qiáng)類型語言,參數(shù)a和b的類型在編譯時(shí)就必須聲明。因此需要對不同的數(shù)據(jù)類型分別定義不同的版本。 1. 模板的作用模板的作用 int min(int a, int b) /求兩個(gè)整數(shù)中的最小值求兩個(gè)整數(shù)中的最小值 int temp; temp=ab?a:b; return temp; float min(float a, float b) /求兩個(gè)實(shí)型數(shù)據(jù)中的最小值求兩個(gè)實(shí)型數(shù)據(jù)中的最小值 float temp;

2、temp=ab?a:b; return temp; l使用模板,把數(shù)據(jù)類型本身作為一個(gè)參數(shù),使用模板,把數(shù)據(jù)類型本身作為一個(gè)參數(shù),這樣就可以使用一套代碼完成不同數(shù)據(jù)類型的這樣就可以使用一套代碼完成不同數(shù)據(jù)類型的數(shù)據(jù)交換,實(shí)際上也使編程趨于標(biāo)準(zhǔn)化。與聲數(shù)據(jù)交換,實(shí)際上也使編程趨于標(biāo)準(zhǔn)化。與聲明和定義通常不在一起的普通函數(shù)不同,函數(shù)明和定義通常不在一起的普通函數(shù)不同,函數(shù)模版的定義緊接其聲明之后。其格式如下:模版的定義緊接其聲明之后。其格式如下:template 返回值類型返回值類型 函數(shù)名函數(shù)名 (形參表)(形參表)/函數(shù)體函數(shù)體關(guān)鍵字不能省略參數(shù)項(xiàng)由關(guān)鍵字class后跟一個(gè)標(biāo)識(shí)符組成編寫函數(shù)模

3、板的方法是:編寫函數(shù)模板的方法是:第一步:定義一個(gè)普通的函數(shù),數(shù)據(jù)類型采用第一步:定義一個(gè)普通的函數(shù),數(shù)據(jù)類型采用具體的普通的數(shù)據(jù)類型。具體的普通的數(shù)據(jù)類型。第二步:將數(shù)據(jù)類型參數(shù)化:將其中需要使用第二步:將數(shù)據(jù)類型參數(shù)化:將其中需要使用到的具體數(shù)據(jù)類型名到的具體數(shù)據(jù)類型名(如如 int )全部替換成由自己全部替換成由自己定義的抽象的類型參數(shù)名定義的抽象的類型參數(shù)名(如如T)。第三步:在函數(shù)頭前用關(guān)鍵字第三步:在函數(shù)頭前用關(guān)鍵字template引出對引出對類型參數(shù)名的聲明。這樣就把一個(gè)具體的函數(shù)類型參數(shù)名的聲明。這樣就把一個(gè)具體的函數(shù)改造成一個(gè)通用的函數(shù)模板:改造成一個(gè)通用的函數(shù)模板:【例【例

4、13.1】 用模板實(shí)現(xiàn)求兩數(shù)中最小值函數(shù)用模板實(shí)現(xiàn)求兩數(shù)中最小值函數(shù)min( )。#include template T min(T a,T b) T temp; temp=ab?a:b; return temp;void main( ) int a=10,b=20,c; c=min(a,b);cout min( a , b)= c endl;程序輸出結(jié)果為程序輸出結(jié)果為:min(10,20)=10min(8.7,5.4)=5.4說明:說明:(1雖然函數(shù)模板中的類型參數(shù)雖然函數(shù)模板中的類型參數(shù)T可以被實(shí)例可以被實(shí)例化為各種類型,其實(shí)際類型取決于模板函數(shù)給化為各種類型,其實(shí)際類型取決于模板函數(shù)給

5、出的實(shí)參類型。但是,實(shí)例化出的實(shí)參類型。但是,實(shí)例化T的各模板函數(shù)的的各模板函數(shù)的實(shí)參之間必須保持完全一致的類型,否則會(huì)出實(shí)參之間必須保持完全一致的類型,否則會(huì)出現(xiàn)語法錯(cuò)誤?,F(xiàn)語法錯(cuò)誤?!纠纠?3.2 】分析下面程序的運(yùn)行結(jié)果。】分析下面程序的運(yùn)行結(jié)果。#include template T min(T a,T b) T temp; temp=ab?a:b; return temp;l(2區(qū)分兩個(gè)術(shù)語區(qū)分兩個(gè)術(shù)語函數(shù)模板和模板函數(shù)。函數(shù)模板和模板函數(shù)。其中函數(shù)模板是對一組函數(shù)的描述,它不是一其中函數(shù)模板是對一組函數(shù)的描述,它不是一個(gè)實(shí)實(shí)在在的函數(shù),編譯系統(tǒng)并不產(chǎn)生任何執(zhí)個(gè)實(shí)實(shí)在在的函數(shù),編譯

6、系統(tǒng)并不產(chǎn)生任何執(zhí)行代碼;而模板函數(shù)則是類型參數(shù)實(shí)例化之后行代碼;而模板函數(shù)則是類型參數(shù)實(shí)例化之后的函數(shù)。它們倆之間的關(guān)系就好像類與對象的的函數(shù)。它們倆之間的關(guān)系就好像類與對象的關(guān)系。關(guān)系。l(3模板函數(shù)與重載是密切相關(guān)的。從函數(shù)模模板函數(shù)與重載是密切相關(guān)的。從函數(shù)模板產(chǎn)生的模板函數(shù)都是同名的,因此編譯器采板產(chǎn)生的模板函數(shù)都是同名的,因此編譯器采用重載的解決方法調(diào)用相應(yīng)函數(shù)。注意,模板用重載的解決方法調(diào)用相應(yīng)函數(shù)。注意,模板函數(shù)雖然類似于重載函數(shù),但它要更嚴(yán)格一些函數(shù)雖然類似于重載函數(shù),但它要更嚴(yán)格一些。函數(shù)被重載時(shí),在每個(gè)函數(shù)體內(nèi)可以執(zhí)行不。函數(shù)被重載時(shí),在每個(gè)函數(shù)體內(nèi)可以執(zhí)行不同的動(dòng)作,但

7、同一函數(shù)模板實(shí)例化后的所有模同的動(dòng)作,但同一函數(shù)模板實(shí)例化后的所有模板函數(shù)都必須執(zhí)行相同的動(dòng)作。板函數(shù)都必須執(zhí)行相同的動(dòng)作?!纠纠?3.3 】分析以下程序的運(yùn)行結(jié)果?!糠治鲆韵鲁绦虻倪\(yùn)行結(jié)果。#include #include template T Sum(T* array ,int size=0) /AT total=0;return total;執(zhí)行程序后,輸出結(jié)果為:執(zhí)行程序后,輸出結(jié)果為:The sum of integer array is: 0The sum of double array is: 0The sum of integer array and double arra

8、y is: 57.6The sum of two strings is: How are you?在在C+編譯時(shí),函數(shù)模板和同名的非模板函數(shù)重編譯時(shí),函數(shù)模板和同名的非模板函數(shù)重載時(shí),編譯器通過如下的匹配過程確定調(diào)用哪一載時(shí),編譯器通過如下的匹配過程確定調(diào)用哪一個(gè)函數(shù):個(gè)函數(shù):(1)先去匹配最符合函數(shù)名和參數(shù)類型的函數(shù)調(diào)用,先去匹配最符合函數(shù)名和參數(shù)類型的函數(shù)調(diào)用,即優(yōu)先調(diào)用對應(yīng)的一般函數(shù)非模板函數(shù))。如即優(yōu)先調(diào)用對應(yīng)的一般函數(shù)非模板函數(shù))。如果參數(shù)完全匹配,則調(diào)用重載函數(shù)。果參數(shù)完全匹配,則調(diào)用重載函數(shù)。(2)如果重載函數(shù)的參數(shù)類型不匹配,則去匹配函數(shù)如果重載函數(shù)的參數(shù)類型不匹配,則去匹配函

9、數(shù)模板,將其實(shí)例化產(chǎn)生一個(gè)匹配的模板函數(shù),如模板,將其實(shí)例化產(chǎn)生一個(gè)匹配的模板函數(shù),如果匹配成功,則調(diào)用此模板函數(shù)。果匹配成功,則調(diào)用此模板函數(shù)。(3)如果模板函數(shù)匹配不成功,編譯器嘗試通過類如果模板函數(shù)匹配不成功,編譯器嘗試通過類型轉(zhuǎn)換,來檢驗(yàn)調(diào)用是否和重載函數(shù)匹配,如型轉(zhuǎn)換,來檢驗(yàn)調(diào)用是否和重載函數(shù)匹配,如果是,則調(diào)用重載函數(shù)。果是,則調(diào)用重載函數(shù)。(4)如果上述操作均不能進(jìn)行,則產(chǎn)生編譯錯(cuò)誤。如果上述操作均不能進(jìn)行,則產(chǎn)生編譯錯(cuò)誤。如果最后得到了多于一種選擇,那么這個(gè)函數(shù)如果最后得到了多于一種選擇,那么這個(gè)函數(shù)調(diào)用有二義性,指出是一種錯(cuò)誤的函數(shù)調(diào)用。調(diào)用有二義性,指出是一種錯(cuò)誤的函數(shù)調(diào)用

10、。 類模板可以讓用戶為類聲明一種模式,使得類類模板可以讓用戶為類聲明一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型。些成員函數(shù)的返回值能取任意類型。定義類模板的格式為:定義類模板的格式為:template class 類名類名/類體類體;如果需要在類模板以外定義其成員函數(shù),則要如果需要在類模板以外定義其成員函數(shù),則要采用以下的形式:采用以下的形式:template返回值類型返回值類型 類名類名:函數(shù)名函數(shù)名(參數(shù)表參數(shù)表) /函數(shù)體函數(shù)體 類模板不代表一個(gè)具體的、實(shí)際的類,而代類模板不代表一個(gè)具體的、實(shí)際的類,而代

11、表若干個(gè)具有相同特性的類,它是生成類的樣表若干個(gè)具有相同特性的類,它是生成類的樣板。實(shí)際上,類模板的使用就是將類模板實(shí)例板。實(shí)際上,類模板的使用就是將類模板實(shí)例化為一個(gè)個(gè)具體的類,即模板類,然后再通過化為一個(gè)個(gè)具體的類,即模板類,然后再通過模板類建立對象。模板類建立對象。 說明模板類對象的格式為:說明模板類對象的格式為: 對象對象1, ,對象對象n;【例【例13.4】堆棧類模板】堆棧類模板Stack的使用。的使用。#include template /定義堆棧類的模板定義堆棧類的模板class Stack T* data;int top; /棧頂棧頂;int size; /堆棧的尺寸堆棧的尺寸

12、int IsEmpty() return (top0)? 1:0; /判斷堆棧是否為空判斷堆棧是否為空void main( ) /測試堆棧類模板測試堆棧類模板Stackcout-整數(shù)堆棧整數(shù)堆棧-n;Stack x(5); /定義一個(gè)可以放定義一個(gè)可以放5個(gè)整型元素的堆棧個(gè)整型元素的堆棧x.push(1);x.push(2);coutx.pop( )endl;x.push(3);x.push(4);coutx.pop( )endl;coutx.pop( )endl;程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:-整數(shù)堆棧整數(shù)堆棧-2431-浮點(diǎn)數(shù)堆棧浮點(diǎn)數(shù)堆棧-3.42.55.22.1【例【例13.5】使用類模板,編寫一個(gè)對數(shù)組進(jìn)行】使用類模板,編寫一個(gè)對數(shù)組進(jìn)行排序、查找和求元素和的程序。排序、查找和求元素和的程序。 分析:設(shè)計(jì)一個(gè)類模板分析:設(shè)計(jì)一個(gè)類模板templateclass Array,用于對,用于對T類型的數(shù)組進(jìn)行排序類型的數(shù)組進(jìn)行排序、查找和求元素和,然后由此產(chǎn)生模板類、查找和求元素和,然后由此產(chǎn)生模板類Array和和Array。 程序的執(zhí)行結(jié)果為:程序的執(zhí)行結(jié)果為: 序列序列1: 原序列:原序列:6 3 8 1 9 4 7 5 2 8在序列在序列1中的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論