版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購合同會審制度的應(yīng)用探討3篇
- 采購合同談判策略3篇
- 采購戰(zhàn)略合同的制定與執(zhí)行3篇
- 采購合同的管理流程3篇
- 采購合同分析3篇
- 2024年地暖工程智能化控制系統(tǒng)研發(fā)與制造合同3篇
- 2024年度教育機(jī)構(gòu)經(jīng)費(fèi)預(yù)算與使用合同3篇
- 2024年度文化旅游項(xiàng)目招投標(biāo)合同管理與文化遺產(chǎn)保護(hù)合同3篇
- 2024年標(biāo)準(zhǔn)外貿(mào)銷售合同中英文本版
- 2024債轉(zhuǎn)股合同復(fù)雜多條款與債務(wù)重組后的投資者權(quán)益保護(hù)協(xié)議3篇
- 01中國電信云計算產(chǎn)品體系架構(gòu)
- 飲食基因與文化智慧樹知到期末考試答案2024年
- 廣東省課程思政示范高職院校申報書
- 墻面修復(fù)施工方案
- 徐工集團(tuán)招聘測評題庫
- 初中語文九年級下冊《短詩五首-月夜》+教學(xué)課件
- 開荒保潔物業(yè)管理開荒保潔服務(wù)實(shí)施方案
- 山東省煙臺市萊州市2023-2024學(xué)年五年級上學(xué)期期末考試數(shù)學(xué)試題
- 2016-2023年南京信息職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年考點(diǎn)試題甄選合集含答案解析
- 山東省棗莊市滕州市2023-2024學(xué)年高二上學(xué)期1月期末考試物理試題
- 售前解決方案部門管理規(guī)章制度
評論
0/150
提交評論