版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)學(xué)院計(jì)算機(jī)網(wǎng)絡(luò)與信息安全研究室張榮博面向?qū)ο蟪绦蛟O(shè)計(jì)及C++第9章模板與泛型編程9.1模板概念(★)9.2函數(shù)模板9.3類模板9.4泛型編程(★)1教學(xué)目標(biāo)了解泛型編程的概念及形式。重點(diǎn)及難點(diǎn)重點(diǎn):類模板及函數(shù)模版的定義。難點(diǎn):模板的應(yīng)用。2模板的概念C++中常見的問題voidswap(int&a,int&b){
int
tmp=0;
tmp=a;a=b;b=tmp;}//交換兩個(gè)浮點(diǎn)數(shù)voidswap(float&a,float&b){floattmp=0.0;
tmp=a;a=b;b=tmp;}intmain(){
inta=10,b=20;floatc=1.2,d=2.4;
cout<<“a=“<<a<<“b=”<<b;
cout<<“c=“<<c<<“d=”<<c;swap(a,b);cout<<“a=“<<a<<“b=”<<b;
swap(c,d);cout<<“c=“<<c<<“d=”<<c;return0;}3提出問題在上面例子中,兩個(gè)swap函數(shù)實(shí)現(xiàn)的功能相同,只是參數(shù)類型不同,為了實(shí)現(xiàn)不同類型的數(shù)據(jù)交換必須重新編輯函數(shù)。造成了重復(fù)勞動(dòng)。面向?qū)ο蟪绦蛟O(shè)計(jì)方法出現(xiàn)的目的之一是實(shí)現(xiàn)軟件重用,能否提供一種方法將兩個(gè)函數(shù)合并到一起,以節(jié)省開發(fā)成本?4解決方法typedef
int
DataType;voidswap(DataType&a,DataType&b){
DataType
tmp;
tmp=a; a=b; b=tmp;}intmain(){
inta=10,b=20;
swap(a,b);return0;}5分析問題當(dāng)需要交換兩個(gè)浮點(diǎn)數(shù)時(shí)可以將DataType
定義成float型數(shù)據(jù)即可。缺點(diǎn):
更改一種數(shù)據(jù)類型時(shí),需要修改程序源代碼,必須重新編譯程序。無法解決的問題:
如果程序中需要交換多種數(shù)據(jù)類型之間的數(shù)據(jù)該怎么辦?6typedef
int
DataType;voidswap(DataType&a,DataType&b){
DataType
tmp;
tmp=a; a=b; b=tmp;}intmain(){
inta=10,b=20;
floatc=1.2,d=2.4;
swap(a,b);
swap(c,d);return0;}能否將swap函數(shù)的形式參數(shù),作為一種無類型的參數(shù),當(dāng)使用它的時(shí)候再將它用具體的參數(shù)實(shí)現(xiàn)?就像采用滯后捆綁實(shí)現(xiàn)多態(tài)一樣!7模板的定義模板本質(zhì)上就是參數(shù)化多態(tài),是一種使用無類型參數(shù)來產(chǎn)生一系列函數(shù)或類的機(jī)制,是C++的一個(gè)重要特性。模板可以分為兩類:函數(shù)模板類模板8函數(shù)模板與模板函數(shù)函數(shù)模板可以用來創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不同形參,進(jìn)一步簡化重載函數(shù)的函數(shù)體設(shè)計(jì)。聲明方法:
template
<class
T>
//模板聲明
Tmax(Tx,Ty) //定義函數(shù)模板
{ return(x>y)?x:y;}9模板函數(shù)max代表的是一類函數(shù),是函數(shù)的集合;要用max進(jìn)行真正的操作前,先要將模板參數(shù)T實(shí)例化為一般的類型(如int
等);max是一個(gè)函數(shù)模板,將T實(shí)例化的參數(shù)稱為模板實(shí)參,用模板實(shí)參實(shí)例化的函數(shù)稱為模板函數(shù)。template<classT>//模板聲明Tmax(Tx,Ty){return(x>y)?x:y;}10例題#include<iostream>usingnamespacestd;template<classT>Tmax(Tx,Ty){return(x>y)?x:y;}voidmain(){
inti=10,j=56; floatx1=50.34f,x2=56.34f; doubley1=673.36,y2=465.972;
cout<<"Themaxofi,jis:"<<max(i,j)<<endl;
cout<<"Themaxofx1,y1is:"<<max(x1,x2)<<endl;
cout<<"Themaxofx2,y2is:"<<max(y1,y2)<<endl;}11
cout<<"Themaxofi,jis:"<<max(i,j)<<endl;當(dāng)編譯器遇到max(i,j)時(shí),生成函數(shù)名max(int,int):用模板實(shí)參int將類型參數(shù)T進(jìn)行了實(shí)例化。
cout<<"Themaxofx1,y1is:"<<max(x1,x2)<<endl;當(dāng)編譯器遇到max(x1,x2)時(shí),生成函數(shù)名max(float,float):用模板實(shí)參float將類型參數(shù)T進(jìn)行了實(shí)例化。
cout<<"Themaxofx2,y2is:"<<max(y1,y2)<<endl;當(dāng)編譯器遇到max(y1,y2)時(shí),生成函數(shù)名max(double,double):max(y1,y2)用模板實(shí)參double將類型參數(shù)T進(jìn)行了實(shí)例化12
因此,上例中max函數(shù)可以用顯式模板類型的方法寫成下面的形勢:
voidmain() {
inti=10,j=56;
floatx1=50.34f,x2=56.34f;
doubley1=673.36,y2=465.972;
cout<<"Themaxofi,jis:“ <<max<int>(i,j)<<endl;
cout<<"Themaxofx1,y1is:“
<<max<float>(x1,x2)<<endl;
cout<<"Themaxofx2,y2is:“ <<max<double>(y1,y2)<<endl; }13模板參數(shù)表:是由若干個(gè)模板參數(shù)組成的。各參數(shù)間用逗號隔開,每個(gè)模板參數(shù)均是由類型參數(shù)和參數(shù)說明兩部分,而類型參數(shù)指的是class標(biāo)識符。 例如:
template
<classT1,class
T2,classT3>//模板聲明
T1fun(T2x,T3y){ ……..}多個(gè)不定參數(shù)的模板函數(shù)的定義14注意:一般用T作為模板參數(shù)標(biāo)識符,T代表任意類型。但實(shí)質(zhì)上用任何字母都可以:如:template<classS>或template<classa>。
函數(shù)模板小結(jié)15類模板與模板類的概念
類模板:一個(gè)類模板允許用戶為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值,能取任意類型。它的存在不代表一個(gè)具體的、實(shí)際的類,而是代表一類的類,是類的集合。16
類模板的定義
template<classT>
//聲明一個(gè)類模板
classclassname{
intNo;
Tvalue;public:
TGetValue(){returnvalue;}voidSetValue(T&v){value=v;}};17在類定義體外定義成員函數(shù)時(shí),若此成員函數(shù)中有模板參數(shù)存在,則需在函數(shù)體外進(jìn)行模板聲明,并且在函數(shù)名前的類名后綴上”<T>”。
template<classT>
voidclassname<T>::SetValue(T&v){
vulae=v;}template<classT>
Tclassname<T>::GetValue(){returnvulae;}18類模板的使用類模板的使用。類模板的使用實(shí)際上是將類模板實(shí)例化成一個(gè)具體的類,它的格式為:類名
<實(shí)際的類型>對象名;intmain(){
classname<float>obj; obj.SetValue(1.0);
float
tmp=obj.GetValue();}19//舉例定義類#include<iostream>using
namespace
std;template<classT>//聲明模板classnode{//定義結(jié)構(gòu)模板
Tval;//val取任意類型,即模板參數(shù)類型
node<T>*next;//此處node為結(jié)構(gòu)模板};template<classT>//聲明模板classlist{//定義類模板
node<T>*head;//此處node為結(jié)構(gòu)模板
intsize;public: list(){head=NULL;size=0;}
boolinsert(Tval);voidprint();~list();};鏈表類模板的定義20//定義成員函數(shù),插入函數(shù)template<classT>boollist<T>::insert(Tx){ node<T>*nodes=newnode<T>;
if(nodes) { nodes->val=x; nodes->next=head; head=nodes; size++;
return
true; }
return
false;}21//定義成員函數(shù)輸出函數(shù)template<classT>voidlist<T>::print(){
for(node<T>*p=head;p;p=p->next)
cout<<p->val<<"";
cout<<endl;}//析構(gòu)函數(shù)template<classT>//聲明模板list<T>::~list()//定義函數(shù)模板,其中l(wèi)ist為類模板{ node<T>*temp;//node為結(jié)構(gòu)模板
for(node<T>*p=head;p;){ temp=p; p=p->next;
deletetemp; }}22//類模板的使用voidmain(){//定義一個(gè)整型鏈表對象,此時(shí)傳進(jìn)來的模板參數(shù)為<int> list<int>intlist; intlist.insert(34); intlist.insert(54);
intlist.print();
//定義一個(gè)浮點(diǎn)型鏈表對象,此時(shí)傳進(jìn)來的模板參數(shù)為<float>list<float>floatlist; floatlist.insert(34.56f);floatlist.insert(65.4f);
floatlist.print();
//定義一個(gè)字符串型鏈表對象,此時(shí)傳進(jìn)來的模板參數(shù)為<char*> list<char*>charlist;
charlist.insert("windows");
charlist.insert("object");
charlist.print();}543465.434.56objectwindows23類模板總結(jié)24模板、類、對象、函數(shù)之間的關(guān)系25群體的概念群體是指由多個(gè)數(shù)據(jù)元素組成的集合體。群體可以分為兩個(gè)大類:線性群體和非線性群體。線性群體中的元素按位置排列有序(數(shù)組)。非線性群體不用位置順序來標(biāo)識元素(鏈表)。26泛型編程將程序?qū)懙帽M可能通用;將算法從特定的數(shù)據(jù)結(jié)構(gòu)中抽象出來,成為通用的;C++的模板為泛型程序設(shè)計(jì)奠定了關(guān)鍵的基礎(chǔ);STL是泛型程序設(shè)計(jì)的一個(gè)范例。容器(container)迭代器(iterator)算法(algorithms)函數(shù)對象(functionobject)27容器容器類是容納、包含一組元素或元素集合的對象。異類容器類與同類容器類順序容器與關(guān)聯(lián)容器七種基本容器:
向量(vector)、雙端隊(duì)列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)28容器的接口通用容器運(yùn)算符==,!=,>,>=,<,<=,=方法(函數(shù))迭代方法(指針的移動(dòng))begin(),end(),rbegin(),rend()訪問方法size(),max_size(),swap(),empty()29適配器與迭代器適配器是一種接口類(棧適配器)為已有的類提供新的接口。目的是簡化、約束、使之安全、隱藏或者改變被修改類提供的服務(wù)集合。迭代器是面向?qū)ο蟀姹镜闹羔?,它們提供了訪問容器、序列中每個(gè)元素的方法30算法與函數(shù)對象C++標(biāo)準(zhǔn)模板庫中包括70多個(gè)算法其中包括查找算法,排序算法,消除算法,記數(shù)算法,比較算法,變換算法,置換算法和容器管理等等。函數(shù)對象一個(gè)行為類似函數(shù)的對象,它可以沒有參數(shù),也可以帶有若干參數(shù),其功能是獲取一個(gè)值,或者改變操作的狀態(tài)。31順序容器——向量向量屬于順序容器,用于容納不定長線性序列(即線性群體),提供對序列的快速隨機(jī)訪問(也稱直接訪問)向量是動(dòng)態(tài)結(jié)構(gòu),它的大小不固定,可以在程序運(yùn)行時(shí)增加或減少。向量是應(yīng)用較多的STL容器。例題:求范圍2~N中的質(zhì)數(shù),N在程序運(yùn)行時(shí)由鍵盤輸入。32//10_
溫馨提示
- 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)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年天津醫(yī)學(xué)高等??茖W(xué)校單招職業(yè)傾向性考試模擬測試卷帶答案解析
- 2025年鶴壁職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案解析
- 2025年湟源縣幼兒園教師招教考試備考題庫帶答案解析(必刷)
- 2025年金寨縣招教考試備考題庫帶答案解析(必刷)
- 2025年五邑大學(xué)馬克思主義基本原理概論期末考試模擬題附答案解析(奪冠)
- 2025年沂南縣招教考試備考題庫及答案解析(奪冠)
- 2025年元謀縣招教考試備考題庫附答案解析
- 2026年江西公務(wù)員考試試題及答案
- 2026年AI算法工程師校招面試題解析
- 醫(yī)院醫(yī)療信息與網(wǎng)絡(luò)安全管理制度
- (一模)烏魯木齊地區(qū)2026年高三年級第一次質(zhì)量監(jiān)測物理試卷(含答案)
- 高級消防設(shè)施操作員模擬試題及答案(新版)9
- 江蘇省南通市如皋市創(chuàng)新班2025-2026學(xué)年高一上學(xué)期期末數(shù)學(xué)試題+答案
- 內(nèi)科護(hù)理科研進(jìn)展
- 安徽省蚌埠市2024-2025學(xué)年高二上學(xué)期期末考試 物理 含解析
- 配送員派單勞務(wù)合同范本
- 退休人員返聘勞務(wù)合同
- 二十四節(jié)氣和農(nóng)業(yè)生產(chǎn)的關(guān)系
- 鑄牢中華民族共同體意識課件
- 屋頂光伏安全專項(xiàng)施工方案
- 法院證據(jù)目錄(訴訟)
評論
0/150
提交評論