面向?qū)ο缶幊碳夹g(shù)與方法 課件 第8章 模板_第1頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第8章 模板_第2頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第8章 模板_第3頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第8章 模板_第4頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第8章 模板_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第8章模板第8章模板第8章

模板

8.1函數(shù)模板

8.1.1函數(shù)模板的定義與使用

8.1.2函數(shù)模板重載

8.1.3函數(shù)模板專門化

8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板

8.2類模板

8.2.1類模板的定義與使用

8.2.2類模板專門化

8.2.3作為函數(shù)的參數(shù)及返回類型

8.2.4使用標(biāo)準(zhǔn)庫中的類模板

8.2.5類模板的繼承與派生

8.3小結(jié)

第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用

8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 函數(shù)重載將參數(shù)不同、功能類似的函數(shù)定義相同的名字,使用戶感到含義清楚。但是對于函數(shù)設(shè)計者而言,仍要分別定義每個函數(shù)。對于功能相同、數(shù)據(jù)類型不同的函數(shù),能不能只編寫一次源代碼呢?第8章模板可以定義一個函數(shù),它的返回類型或形參類型(部分或全部)不具體指定,而用一個或多個抽象的類型參數(shù)來表示,這種函數(shù)形式就稱為函數(shù)模板。在調(diào)用函數(shù)處,編譯器會用具體的實參類型代替抽象的類型參數(shù),這個過程稱為實例化。第8章模板//例8-1.求兩數(shù)之和的函數(shù)模板#include<iostream>usingnamespacestd;template<typenameT>//T為類型參數(shù)T

add(Tx,Ty){return(x+y);}

intmain(){ doubled1=0.5,d2=8.8;cout<<add(2,3)<<“,”;//T→int.或add<int>(2,3)cout<<add(d1,d2)<<endl;//T→double.或 //add<double>(d1,d2)return0;}函數(shù)模板并不是一個真正的函數(shù)。程序編譯時,編譯器根據(jù)調(diào)用語句中的實參類型對函數(shù)模板實例化,生成一個具體的可運(yùn)行的函數(shù)。例如,編譯add(2,3)時,編譯器發(fā)現(xiàn)2和3是int型,于是使用如下版本的函數(shù):

intadd(intx,inty){return(x+y);}編譯add(d1,d2)時,編譯器發(fā)現(xiàn)d1和d2是double型,于是使用如下版本的函數(shù): doubleadd(doublex,doubley){return(x+y);}函數(shù)模板的形參列表中也可以帶其他類型的參數(shù)。第8章模板運(yùn)行結(jié)果:11.210第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載

8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.2函數(shù)模板重載 函數(shù)模板也可以重載。編譯器通過匹配過程,可以正確決定應(yīng)該調(diào)用哪個函數(shù)形式。當(dāng)程序中同時重載有函數(shù)模板和非模板函數(shù)時,編譯器會優(yōu)先選用非模板函數(shù),當(dāng)然前提是類型最佳匹配。如果一個調(diào)用有多于一個的匹配選擇,則說明函數(shù)或函數(shù)模板在定義時存在歧義,編譯時將會出錯。8.1函數(shù)模板運(yùn)行結(jié)果:4.4,4.4,8.8Dr第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化

8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.3函數(shù)模板專門化 使用函數(shù)模板,編譯器會根據(jù)實參類型自動將模板實例化,即用具體的數(shù)據(jù)類型代替類型參數(shù)。C++也提供一種將模板顯性專門化的語法。即定義函數(shù)時,使用前綴“template<>”,后面是針對具體類型的函數(shù)定義:

template<> stringLarger<string>(stringx1,stringx2) {return(x1>x2)?X1:x2;}“template<>”的目的是告訴編譯器,當(dāng)數(shù)據(jù)類型為string時選用專門化的定義形式。其中函數(shù)名后面<string>可以省略。8.1函數(shù)模板運(yùn)行結(jié)果:5.5template<>string-b2第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板 C++標(biāo)準(zhǔn)庫中的算法函數(shù)基本上都是模板,適用于數(shù)組等容器類型,編程時可以直接使用,但要#include相應(yīng)的頭文件。主要的頭文件有<algorithm>、<utility>、<functional>、<numeric>等。下例演示如何使用標(biāo)準(zhǔn)庫中定義的泛型函數(shù),進(jìn)行數(shù)組元素排序、復(fù)制、輸出等操作。8.1函數(shù)模板運(yùn)行結(jié)果:1.14.42.23.31.12.23.34.44.43.32.21.1第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.1類模板的定義與使用 第8章模板類模板就像一個能裝水、油等的容器,適用于多種數(shù)據(jù)類型。

template<typenameT1,typenameT2>

類定義在建立類對象處,編譯器會用實際數(shù)據(jù)類型代替類模板中的類型參數(shù),形成模板類,這是一個實例化的過程。一般來說,為了確保在每個必須實例化類模板的文件中都有類模板的定義,類模板定義應(yīng)該放在頭文件中。類模板的成員函數(shù)都是函數(shù)模板。運(yùn)行結(jié)果:9,8,7,6,5,4,3,2,1,0,3.14第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化

8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.2類模板的專門化 像函數(shù)模板一樣,類模板也可以使用前綴template<>進(jìn)行專門化定義。下例,要求產(chǎn)生int、double型的模板類時,使用類模板TStack進(jìn)行實例化;當(dāng)產(chǎn)生string型棧時,使用專門化的定義。運(yùn)行結(jié)果:9,8,7,6,5,4,3,2,1,0,3.14template<>C++第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型

8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.3作為函數(shù)的參數(shù)及返回類型 任何數(shù)據(jù)類型,包括用戶自定義的類或類模板,都可以作為函數(shù)(模板)的參數(shù)和返回類型。例8-10求數(shù)組元素的最大/最小值及其索引:第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板

8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.4使用標(biāo)準(zhǔn)庫中的類模板 前面我們定義了一個簡單的棧類模板TStack。實際上C++標(biāo)準(zhǔn)庫已經(jīng)為我們定義了一個棧類模板stack,使用時只要包含頭文件<stack>即可。C++標(biāo)準(zhǔn)庫中的類型大部分以模板的形式定義。運(yùn)行結(jié)果:9876543210第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.5類模板的繼承與派生 運(yùn)行結(jié)果:4,52.5,3.5radius=2.52,3radius=2第8章模板8.3小結(jié)模板將數(shù)據(jù)類型參數(shù)化,為我們提供一種源代碼重用方法。對于功能相同而數(shù)據(jù)類型不同的操作,可以定義一個通用函數(shù)模板,在調(diào)用函數(shù)處編譯器會用實參的類型代

溫馨提示

  • 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

提交評論