面向對象編程技術與方法 課件 第8章 模板_第1頁
面向對象編程技術與方法 課件 第8章 模板_第2頁
面向對象編程技術與方法 課件 第8章 模板_第3頁
面向對象編程技術與方法 課件 第8章 模板_第4頁
面向對象編程技術與方法 課件 第8章 模板_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

面向對象編程技術與方法(C++)

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

模板

8.1函數模板

8.1.1函數模板的定義與使用

8.1.2函數模板重載

8.1.3函數模板專門化

8.1.4使用標準庫中的函數模板

8.2類模板

8.2.1類模板的定義與使用

8.2.2類模板專門化

8.2.3作為函數的參數及返回類型

8.2.4使用標準庫中的類模板

8.2.5類模板的繼承與派生

8.3小結

第8章模板8.1函數模板8.1.1函數模板的定義與使用

8.1.2函數模板重載 8.1.3函數模板專門化 8.1.4使用標準庫中的函數模板第8章模板8.1函數模板8.1.1函數模板的定義與使用 函數重載將參數不同、功能類似的函數定義相同的名字,使用戶感到含義清楚。但是對于函數設計者而言,仍要分別定義每個函數。對于功能相同、數據類型不同的函數,能不能只編寫一次源代碼呢?第8章模板可以定義一個函數,它的返回類型或形參類型(部分或全部)不具體指定,而用一個或多個抽象的類型參數來表示,這種函數形式就稱為函數模板。在調用函數處,編譯器會用具體的實參類型代替抽象的類型參數,這個過程稱為實例化。第8章模板//例8-1.求兩數之和的函數模板#include<iostream>usingnamespacestd;template<typenameT>//T為類型參數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;}函數模板并不是一個真正的函數。程序編譯時,編譯器根據調用語句中的實參類型對函數模板實例化,生成一個具體的可運行的函數。例如,編譯add(2,3)時,編譯器發現2和3是int型,于是使用如下版本的函數:

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

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

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

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

template<typenameT1,typenameT2>

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

8.2.3作為函數的參數及返回類型 8.2.4使用標準庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.2類模板的專門化 像函數模板一樣,類模板也可以使用前綴template<>進行專門化定義。下例,要求產生int、double型的模板類時,使用類模板TStack進行實例化;當產生string型棧時,使用專門化的定義。運行結果: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作為函數的參數及返回類型

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論