




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國家中小學智慧教育平臺應用指南
- 2025年晉中貨運從業資格證考題
- 2025財經學院政府協議采購合同
- 2025年份1月CART療法研發借款協議細胞存活率擔保
- 出資額轉讓協議股權轉讓協議
- 集電線路巡視主要內容及要求
- 二零二五版整體轉讓深圳證券私募基金管理人
- 二零二五版最高額抵押借款合同范例
- 門店地面物料管理制度
- 財務專項資金管理制度
- 尸僵形成后肌肉組織的形態學變化
- 小兒川崎病護理查房課件
- 銀行流動性風險報告
- 設備購置分析報告
- 《動物的家》課件
- 超聲評價頸動脈易損斑塊中國專家共識 2023版
- 《行吊操作規程》課件
- 2023電力行業無人機技術規范
- 阿爾茨海默病護理
- 2023年內科主治醫師303專業知識精編匯總500道含答案735
- 自然辯證法期末考試打印版
評論
0/150
提交評論