




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
ObjectivesTounderstandthepurposeofgenericprogrammingToknowthemechanismoftemplatesTobeabletodefinefunctiontemplatesandinstantiatefunctiontemplatesTobeabletodefineclasstemplatesandinstantiateclasstemplates01IntroductiontoTemplates04ClassTemplates02FunctionTemplates03FunctionTemplateInstantiation05ClassTemplateInstantiation01IntroductiontoTemplatesWhatisaTemplate?Imaginethatwewanttowriteafunctiontofindthemaximumoneoftwovalues.Inpractice,we’dwanttodefineseveralsuchfunctions,eachofwhichwillfindthemaximumvalueofagiventype.CasestudyintmaxV(int
x,int
y){return(x>y)?x:y;}charmaxV(char
x,char
y){return(x>y)?x:y;}doublemaxV(double
x,double
y){return(x>y)?x:y;}#definemaxV(x,
y)((x>y)?x:y)Problem:Macropresentsthepossibilityforserioussideeffects:notypechecking,repetitiveoperationsandsoon.intmain(){inti=5,j=3;cout<<maxV(++i,j);return0;}Result:7TmaxV(Tx,Ty){return(x>y)?x:y;}Result:6TheConceptofTemplatesTemplatemechanismallowsatypetobeaparameterinthedefinitionofaclassorafunction.TmaxV(Tx,Ty){return(x>y)?x:y;}Templatesprovideasimplewaytorepresentawiderangeofgenericconceptsandsimplewaystocombinethem.Templatesarethefoundationforgenericprogramming.Atemplateisablueprintorformulaforcreatingclassesorfunctions.
TemplatesareoneofC++’scapabilitiesforsoftwarereusability.02FunctionTemplatesFunctionTemplatestemplate<typenameidentifier>,ortemplate<classidentifier>function_declaration(orfunction_definition);template<classT>TmaxV(Tx,Ty){return(x>y)?x:y;}Keywordtemplate<typenameT>TmaxV(Tx,Ty){return(x>y)?x:y;}typeidentifierintmaxV(int
x,int
y){return(x>y)?x:y;}charmaxV(char
x,char
y){return(x>y)?x:y;}doublemaxV(double
x,double
y){return(x>y)?x:y;}templateparameterlistkeywordCasestudySyntaxtodefineafunctiontemplateFunctionTemplatesAfunctiontemplatedefinesafamilyoffunctionsthatcanoperatewith
generictypes.Thisallowsustocreateafunctiontemplatewhosefunctionalitycanbeadaptedtomorethanonetypewithoutrepeatingtheentirecodeforeachtype.03FunctionTemplateInstantiationFunctionTemplatesInstantiationtemplate<typename
T>TmaxV(Tx,Ty);//declarationintmain(){cout<<maxV(3,4)<<endl;cout<<maxV(3.4,67.8)<<endl;cout<<maxV('s','x')<<endl;return0;}template<typename
T>//definitionTmaxV(T
x,T
y){return(x>y)?x:y;}Functiontemplateinstantiationfunction_name<type>(arguments);cout<<maxV<int>(3,4);cout<<maxV<double>(3.4,67.8);cout<<maxV<char>('s','x')Functiontemplateinstantiationisacreationof
aconcretefunction.FunctionTemplatesInstantiationWhenwecallafunctiontemplate,thecompiler(ordinarily)usestheargumentsofthecalltodeducethetemplateparameter(s)(T)forus.cout<<maxV(3,4)<<endl;cout<<maxV(3.4,67.8)<<endl;cout<<maxV('s','x')<<endl;Nocodeisgeneratedfromasourcefilethatcontainsonlytemplatedefinitions.Inorderforanycodetoappear,atemplatemustbeinstantiated:thetemplateargumentsmustbedeterminedsothatthecompilercangenerateanactualfunction.FunctionTemplateswithdifferentTypeParameterstemplate<typename
T1,typename
T2>T1getMin(T1
x,T2
y){return
x<y?x:(T1)y;}intmain(){inti=9,j=6;doublea=8.3,b=7.8;cout<<getMin(i,a);return0;}cout<<getMin<int,double>(i,a);template<typename
T1,T2>//errorT1getMin(T1
x,T2
y){return
x<y?x:(T1)y;}FunctionTemplatesandOverloadingBothoftheymakecodesmorecompactandconvenient.Functionoverloadingisnormallyusedtoperformsimilaroridenticaloperationsondifferenttypesofdata.Functiontemplates
areusedtoperformidenticaloperationsondifferenttypesofdata.FunctionTemplates
Overloadingtemplate<typename
T>voidSwap(T&x,T&y);voidSwap(int&x,int&y);intmain(){inti=9,j=6;doublea=8.3,b=7.8;chars='4',t='5';Swap(i,j);Swap(a,b);Swap(s,t);return0;}template<typename
T>voidSwap(T&x,T&y){Ttemp;temp=x;x=y;y=temp;cout<<"Calloftemplate\n";}voidSwap(int&x,int&y){inttemp;temp=x;x=y;y=x;cout<<"Calloffunction\n";}Result:CalloffunctionCalloftemplateCalloftemplateWhenanon-templatefunctionprovidesanequallygoodmatchforacallasafunctiontemplate,thenon-templateversionispreferred.FunctionTemplates
OverloadingTemplate<typenameT>TgetMin(Tp1,Tp2);TgetMin(Tp1,Tp2,Tp3);Template<typenameT>TgetMin(Tp1,Tp2);intgetMin(intp1,intp2);Wecandeclareseveralfunctiontemplateswiththesamenameandevendeclareacombinationoffunctiontemplatesandordinaryfunctionswiththesamename.Thecompileralwaysmatchesfirstfunctionprototypes(exactlymatching),andthenfunctiontemplates.FunctionTemplates
Overloadingtemplate<typenameT>TgetMax(Tx,Ty){cout<<"callingtemplate\n";return(x>y)?x:y;}intgetMax(inti,intj){cout<<"callingafunctionwithinttype\n";return(i>j)?i:j;}intgetMax(doubled,inti){cout<<"callingafunctionwithadoubletype\n";return(d>i)?(int)d:i;}constintn=7;intmain(){inti=5,j=6;doublea=8.3,b=7.8;charc1='a',c2='b';cout<<getMax(i,j)<<endl;cout<<getMax(c1,c2)<<endl;cout<<getMax(a,b)<<endl;cout<<getMax(n,i)<<endl;cout<<getMax('a',1)<<endl;cout<<getMax(2.7,4)<<endl;return0;}123112232FunctionTemplatesResult:callingafunctionwithinttype6callingtemplatebcallingtemplate8.3callingafunctionwithinttype7callingafunctionwithinttype97callingafunctionwithadoubletype404ClassTemplatesClassTemplatesStackisakindofdatastructurewithLIFO(lastin,firstout).Ithastwoprincipaloperations:pushandpop.CasestudyStack+Stack()+~Stack()-IsEmpty():bool-IsFull():bool+push(int&):void+pop():int+peak():int+getSize():intconst-element:int*size:intconst-top:intClassTemplatesclass
Stack{public:Stack();~Stack();voidpush(int&i);intpop();
intpeak();intgetSize()const;private:boolIsEmpty();boolIsFull();const
intsize;int*element;inttop;};Stack+Stack()+~Stack()-IsEmpty():bool-IsFull():bool+push(int&):void+pop():int+peak():int+getSize():intconst-element:int*size:intconst-top:intStack::Stack():size(5),top(0){element=new
int[size];}Stack::~Stack(){delete[]element;}bool
Stack::IsEmpty(){return--top==-1;}bool
Stack::IsFull(){returntop>=size?true:false;}void
Stack::push(int&i){if(!IsFull())element[top++]=i;elsethrow-1;}int
Stack::pop(){if(IsEmpty())throw-2;returnelement[top];}int
Stack::peak(){returnelement[top-1];}int
Stack::getSize()const{returntop;}ClassTemplatesintmain(){Stackst;try{for(inti=0;i<4;i++)st.push(i);cout<<
"----------------\n";cout<<st.getSize()<<st.peak()<<endl;intnum=st.getSize()+1;for(inti=0;i<num;i++)cout<<st.pop()<<
"";}catch(inte){if(e==-1)cout<<
"Thestackisfull.\n";if(e==-2)cout<<
"Thestackisempty.\n";}}template<typename
T>class
Stack{public:Stack();~Stack();voidpush(T&i);Tpop();Tpeak();intgetSize()const;private:boolIsEmpty();boolIsFull();const
intsize;T*element;inttop;};Definitionof
aClassTemplatetemplate<classT>Tisagenerictype(typeparameter)Defineaclassasatemplate.Thisclassiscalledclasstemplate.Typeparameterintheclassmaybedatamembers,andmemberfunctions’parameters,andreturningvalueClassTemplatetemplate<typename
T>Stack<T>::Stack():size(5),top(0){element=new
T[size];}template<typename
T>Stack<T>::~Stack(){delete[]element;}template<typename
T>bool
Stack<T>::IsEmpty(){return--top==-1;}template<typename
T>bool
Stack<T>::IsFull(){returntop<size?true:false;}template<typename
T>void
Stack<T>::push(T&i){if(IsFull())element[top++]=i;elsethrow-1;}template<typename
T>T
Stack<T>::pop(){if(IsEmpty())throw-2;returnelement[top];}template<typename
T>T
Stack<T>::peak(){returnelement[top-1];}template<typename
T>int
Stack<T>::getSize()const{returntop;}05ClassTemplateInstantiationClassTemplateInstantiationintmain(){Stack<int>st;try{for(inti=0;i<4;i++)st.push(i);cout<<
"----------------\n";cout<<st.getSize()<<st.peak()<<endl;intnum=st.getSize()+1;for(inti=0;i<num;i++)cout<<st.pop()<<
"";}catch(inte){if(e==-1)cout<<
"Thestackisfull.\n";if(e==-2)cout<<
"Thestackisempty.\n";}}Classtemplateisinstantiated.st
isatemplateclassobjectTheprocessofgeneratingaconcreteclassfromatemplatedefinitionandtemplateargumentsisoftencalledclass
templateinstantiation.ClassTemplateInstantiationclass
A{public:A()=default;A(int
x):a(x){}friend
ostream&operator<<(ostream&o,A&obj){o<<obj.a;
returno;}private:inta;};intmain(){Stack<A>stObj;try{cout<<
"objectsarepushedintoastackonebyone.\n";for(inti=0;i<4;i++){Aobj=A(i);stObj.push(obj);}Aobj=stObj.peak();cout<<stObj.getSize()<<obj<<endl;cout<<
"objectsarepopedfromastackonebyone.\n";intnum=stObj.getSize()+1;for(inti=0;i<num;i++){Atemp=stObj.pop();cout<<temp;}}catch(inte){if(e==-1)cout<<
"Thestackisfull.\n";if(e==-2)cout<<
"Thestackisempty.\n";}}DefinitionofClassTemplateA<T>-a:T+A(T)+operator+(A<T>&):A<T>&<<C++Global>>+operator<<(ostream&,A<T>&):ostream&+operator>>(istream&,A<T>&):istream&<<C++Friend>>template<typename
T>class
A{public:A(T);A<T>&operator+(A<T>&);friend
ostream&operator<<(ostream&out,A<T>&obj){out<<obj.a<<endl;return
out;}friend
istream&operator>>(istream&in,A<T>&obj){in>>obj.a;return
in;}private:Ta;};ClassTemplateInstantiationtemplate<typename
T>A<T>::A(T
type){a=type;}template<typename
T>A<T>&A<T>::operator+(A<T>&obj){a=a+obj.a;return*this;}intmain(){A<int>intA1(10),intA2(20);cout<<intA1+intA2;cout<<intA2;
A<char>charA(''),charB('');cin>>charA;cin>>charB;cout<<charA+charB;
return0;}Eachinstantiationofaclasstemplateconstitutesanindependentclass.Non-TypeParametersforTemplatestemplate<typename
T,intN>class
mysequence{Tmemblock[N];public:voidsetMember(intx,Tvalue);TgetMember(intx);};template<typename
T,intN>void
mysequence<T,N>::setMem
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Cefadroxil-13C6-BL-S-578-sup-13-sup-C-sub-6-sub-生命科學(xué)試劑-MCE
- 江門職業(yè)技術(shù)學(xué)院《數(shù)字合成基礎(chǔ)(AE)》2023-2024學(xué)年第一學(xué)期期末試卷
- 武漢晴川學(xué)院《理論與實(shí)踐(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江長征職業(yè)技術(shù)學(xué)院《案例與論文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年宿州市重點(diǎn)中學(xué)數(shù)學(xué)七年級第一學(xué)期期末學(xué)業(yè)水平測試模擬試題含解析
- 江蘇省南通港閘區(qū)五校聯(lián)考2024-2025學(xué)年化學(xué)九年級第一學(xué)期期末監(jiān)測試題含解析
- 大連海洋大學(xué)《全科醫(yī)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 企業(yè)資金流動的審計(jì)策略分析
- 遼寧特殊教育師范高等??茖W(xué)?!冬F(xiàn)代食品營養(yǎng)與安全自科類》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025屆北京理工大附中分校七年級數(shù)學(xué)第一學(xué)期期末教學(xué)質(zhì)量檢測試題含解析
- 旅行社導(dǎo)游帶團(tuán)操作流程
- 部編版小學(xué)道德與法治三年級下冊期末質(zhì)量檢測試卷【含答案】5套
- 怎樣當(dāng)好一名師長
- DB21T 3354-2020 遼寧省綠色建筑設(shè)計(jì)標(biāo)準(zhǔn)
- 新生兒復(fù)蘇解析課件
- (完整版)重大危險(xiǎn)源清單及辨識表
- ABI7500熒光定量PCR儀標(biāo)準(zhǔn)操作規(guī)程
- 語言領(lǐng)域核心經(jīng)驗(yàn)《學(xué)前兒童語言學(xué)習(xí)與發(fā)展核心經(jīng)驗(yàn)》
- DB51T 5036-2017 四川省屋面工程施工工藝規(guī)程
- 11級設(shè)計(jì)題目寶豐紅四煤礦
- 08S305-小型潛水泵選用及安裝圖集
評論
0/150
提交評論