![C C++語言程序的設(shè)計(jì)第13章 模板_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/28387c6e-d900-4bf9-8462-53152bf90229/28387c6e-d900-4bf9-8462-53152bf902291.gif)
![C C++語言程序的設(shè)計(jì)第13章 模板_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/28387c6e-d900-4bf9-8462-53152bf90229/28387c6e-d900-4bf9-8462-53152bf902292.gif)
![C C++語言程序的設(shè)計(jì)第13章 模板_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/28387c6e-d900-4bf9-8462-53152bf90229/28387c6e-d900-4bf9-8462-53152bf902293.gif)
![C C++語言程序的設(shè)計(jì)第13章 模板_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/28387c6e-d900-4bf9-8462-53152bf90229/28387c6e-d900-4bf9-8462-53152bf902294.gif)
![C C++語言程序的設(shè)計(jì)第13章 模板_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/24/28387c6e-d900-4bf9-8462-53152bf90229/28387c6e-d900-4bf9-8462-53152bf902295.gif)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中沙購銷合同范本
- 農(nóng)民水果供貨合同范本
- 衛(wèi)浴物資配送合同范本
- 辦公室采購電腦合同范本
- 企業(yè)扶貧購銷合同范本
- 借條抵押合同范本
- 保險(xiǎn)維修合同范例
- 債權(quán)無償轉(zhuǎn)讓合同范本
- 住房指標(biāo)轉(zhuǎn)讓合同范本
- 全自動(dòng)鋁塑包裝機(jī)行業(yè)深度研究報(bào)告
- 項(xiàng)目部、公司成本管理流程圖
- CCAA 基于風(fēng)險(xiǎn)的認(rèn)證合規(guī)管理-認(rèn)證檔案質(zhì)量管理的風(fēng)險(xiǎn)控制
- 高中英語選擇性必修二 Unit 1 Period 1 Reading and thinking(課件)(共38張)
- 小學(xué)生電子小報(bào)通用模板-A4電子小報(bào)15
- CAS云計(jì)算軟件平臺(tái)深入介紹
- 課堂教學(xué)方法與手段(課堂PPT)課件(PPT 16頁)
- 固定資產(chǎn)投資統(tǒng)計(jì)培訓(xùn)PPT課件
- 一年級(jí)上冊必背古詩
- 平頂山第四屆名師名班主任名校長培養(yǎng)方案
- 2.通信光纜線路(管道)工程施工及驗(yàn)收技術(shù)規(guī)程要點(diǎn)
- 蒸壓加氣混凝土砌塊作業(yè)指導(dǎo)書(共14頁)
評論
0/150
提交評論