《C++ STL-數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)》課件第2章 STL 技術(shù)基礎(chǔ)_第1頁
《C++ STL-數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)》課件第2章 STL 技術(shù)基礎(chǔ)_第2頁
《C++ STL-數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)》課件第2章 STL 技術(shù)基礎(chǔ)_第3頁
《C++ STL-數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)》課件第2章 STL 技術(shù)基礎(chǔ)_第4頁
《C++ STL-數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)》課件第2章 STL 技術(shù)基礎(chǔ)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章模板與重載模板概念函數(shù)模板類模板類模板繼承模板特化操作符重載1/31引入模板——代碼重用C++是強(qiáng)類型語言,函數(shù)或類的功能類似,只要數(shù)據(jù)類型不同,就要編寫多份代碼,增加了編程量和源程序長度。例:求a,b最大值,需編寫四個函數(shù)(四份代碼)intMax(inta,intb){return(a>b)?a:b;}floatMax(floata,floatb){return(a>b)?a:b;}doubleMax(doublea,doubleb){return(a>b)?a:b;}charMax(chara,charb){return(a>b)?a:b;}模板概念只寫一份代碼適用多種類型——模板功能相同2/31函數(shù)模板編寫一個函數(shù)模子,用這個模子制造出若干功能相同,參數(shù)類型和返回類型不同的函數(shù)——模板函數(shù)函數(shù)模板的聲明template<classT>//T:類型是參數(shù)TMax(Ta,Tb) {return(a>b)?a:b;}//-----------如此,就做好了一個函數(shù)模板------------在調(diào)用Max函數(shù)時,根據(jù)實(shí)參類型確定T:intx=2,y=5;cout<<Max(x,y);//T→

int函數(shù)模板3/31函數(shù)模板簡例4/31函數(shù)模板中使用多種類型函數(shù)模板中可用多種類型參數(shù)——T1,T2每種類型參數(shù)前加class問:a,b可否實(shí)例化為相同類型?5/31函數(shù)重載參數(shù)類型不同參數(shù)個數(shù)不同問:左邊兩個重載的函數(shù)模板的類型參數(shù)T

是否可以被實(shí)例化為不同的類型?函數(shù)模板重載6/31函數(shù)模板與普通函數(shù)重載函數(shù)模板重載7/31類模板(類屬類/類生成類)概念像函數(shù)模板一樣,類模板是生成具體類的一個模子目的把成員變量的類型、成員函數(shù)參數(shù)的類型、返回值的類型參數(shù)化,使之能適用于多種數(shù)據(jù)類型定義類模板template<classT>//類型參數(shù)T,與函數(shù)模板一樣class類名//類的定義{…//類體};類模板及定義8/31//定義棧的一個類模板constintn=10;template<class

T>//數(shù)據(jù)類型參數(shù)化classStack

//定義類(類模板){

Tstk[n];//順序棧,T為元素類型(可變)

inttop;//棧頂元素的位置,int不變public:Stack(){top=-1;}//構(gòu)造函數(shù),初始化棧頂

voidpush(Tob);//入棧函數(shù),T為參數(shù)的類型

Tpop();//出棧函數(shù),T為返回值類型};類模板定義舉例9/31template<classT>voidStack<T>::push(Tob){if(top==n-1){cout<<"Stackfull";return;}stk[++top]=ob;}成員函數(shù)的類外實(shí)現(xiàn)template<classT>TStack<T>::pop(){if(top<0){cout<<"Stackempty";return(0);}returnstk[top--];}觀察:與普通類的成員函數(shù)實(shí)現(xiàn)有何差別?10/31類模板實(shí)例化

——生成具體的類,由它創(chuàng)建對象

類名<實(shí)際類型>對象名;類模板實(shí)例化T具體化11/31全局類型與模板類型同名——局部優(yōu)先(全局與局部的關(guān)系)typedefstring

type;//全局類型名template<classtype>//局部類型名classG{

typen;//n是什么類型?……};//n不是string類型類模板的其他語法規(guī)則12/31類型參數(shù)可帶缺省類型左←右復(fù)習(xí):函數(shù)參數(shù)帶缺省值template<classT1=char,classT2=int>classA{

T1m1;T2m2;……};又例:template<classT1=int,classT2>classX;//錯template<classT1,classT2=int>classY;//對//實(shí)例化時只給一個具體類型,給予誰?類模板的其他語法規(guī)則13/31A<>a("abc");//缺省實(shí)例化A<double>b;

//1個實(shí)參A<int,bool>c;//2個實(shí)參不要混淆:類型實(shí)例化與變量初始化類模板實(shí)例化:類型參數(shù)帶缺省值template<classT1=char,classT2=int>classA{T1m1;T2m2;};intmain(){

//創(chuàng)建對象時A<int,double>c1;//指定兩個類型A<bool>c2;//第二類型參數(shù)采用缺省類型A<>c3;//兩個類型參數(shù)都用缺省類型//空的<>不能省略!}類模板的其他語法規(guī)則14/31類模板組合內(nèi)嵌其他類模板的對象template<classU>

classA{A<U>*p;//本類可省略<U>不寫。錯:A<>*p;};template<classU>classB{A<U>&a,*b;//<U>不可省略,內(nèi)嵌對象其他模板類的}類模板的其他語法規(guī)則15/3116/73類模板派生<T2>不能省略A<tt1>可否?實(shí)驗(yàn)分析2個類模板實(shí)例化:創(chuàng)建對象構(gòu)造函數(shù)模板特化函數(shù)模板實(shí)例化用它生成具體的函數(shù)(模板函數(shù))——適用多種數(shù)據(jù)類型類模板實(shí)例化用它生成具體的類(模板類)——適用多種數(shù)據(jù)類型模板特化特殊的實(shí)例化對于某種數(shù)據(jù)類型,不能用模板的通用實(shí)例化方法來生成具體的函數(shù)或類時,對這種數(shù)據(jù)類型設(shè)計專門的實(shí)例化方案——函數(shù)模板特化、類模板特化模板特化17/31函數(shù)模板特化不能處理t1和t2是char數(shù)組的情況專門處理t1和t2是char數(shù)組的情況18/31類模板特化完全特化(全特化)對模板的全部類型參數(shù)進(jìn)行特化部分特化(偏特化)對模板的部分類型參數(shù)進(jìn)行特化完全特化下例:類模板特化19/3120/73實(shí)例:類模板全特化部分特化template<classT1,classT2>classvector{

//…//};template<classT>//部分特化:還有類型參數(shù)Tclassvector<bool,T>//第一個參數(shù)為具體類型bool{//第二個參數(shù)T沒有具體化

//…//};類模板部分特化21/31引入加法例1復(fù)數(shù)c1=3+4i,c2=5-10i

加法

c=c1+c2=(3+5)+(4-10)i=8-6i加法例2chars1[]="Chi",s2[]="na";

加法

s1

+

s2="China";C++的“+”運(yùn)算符能實(shí)現(xiàn)如此的加法嗎?重載“+”,擴(kuò)展“+”功能,完成新任務(wù)

——運(yùn)算符重載(即運(yùn)算符函數(shù)重載)操作符重載概念22/31返回類型

operator

運(yùn)算符(形參表){

...//該運(yùn)算符函數(shù)代碼}注意:運(yùn)算符必須是系統(tǒng)定義的,如+,-,=,…不允許重載的運(yùn)算符.成員訪問運(yùn)算符,如:obj.length().*成員指針訪問運(yùn)算符,如:obj.*pt::域限定符,如:obj::fun()sizeof如:sizeof(int)?:條件運(yùn)算符,如:x>y?x:y操作符重載的方法運(yùn)算符函數(shù)23/31操作符重載例復(fù)數(shù)加法例24/31操作符重載例c3=c1+c2

執(zhí)行函數(shù)調(diào)用:c3=c1.operator+(c2);25/31運(yùn)算符函數(shù)的重載方式類的成員函數(shù)(本講義)類的友元函數(shù)(破壞類封裝,不建議)單目/雙目運(yùn)算符重載雙目運(yùn)算符+,執(zhí)行a+b操作數(shù)a和b為A類對象+函數(shù)為A類成員函數(shù)a+b

等價于a.operator+(b)前置單目運(yùn)算符++,執(zhí)行++a++函數(shù)不需形參:operator++();后置單目運(yùn)算符++,執(zhí)行++aoperator++(int);int參數(shù)與前置區(qū)別運(yùn)算符函數(shù)26/31單目運(yùn)算符重載例27/31重載不能改變運(yùn)算符的操作數(shù)個數(shù),例如:><

重載前:二元運(yùn)算符,需兩個操作數(shù)重載后:仍是二元運(yùn)算符*&…既可以是二元運(yùn)算符,也可以是一元運(yùn)算符。重載不能改變運(yùn)算符的優(yōu)先級,例如:*/優(yōu)先級高于+-運(yùn)算符重載函數(shù)不能有默認(rèn)形參否則,改變了參數(shù)(操作數(shù))個數(shù)重載的運(yùn)算符功能應(yīng)與原功能相近,例如:+重載:string對象連接,便于理解操作符重載的限制28/31運(yùn)算符函數(shù)的形參至少有一個是對象或?qū)ο蟮囊?,保證重載運(yùn)算符用于自定義類型(防止修改運(yùn)算符原功能),例:intoperator+(inta,intb)//錯誤{return(a-b);}重載賦值運(yùn)算符=當(dāng)它執(zhí)行同類對象的賦值運(yùn)算時——逐個復(fù)制對象的數(shù)據(jù)成員當(dāng)對象中有指針成員時,完成對象的“淺拷貝”,因此重載=,完成對象的“深拷貝”。操作符重載的限制29/31重載目的自定義類型的數(shù)據(jù)不能直接用

溫馨提示

  • 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

提交評論