C++面向对象程序设计双语教程(第3版)课件 class 14-template_第1页
C++面向对象程序设计双语教程(第3版)课件 class 14-template_第2页
C++面向对象程序设计双语教程(第3版)课件 class 14-template_第3页
C++面向对象程序设计双语教程(第3版)课件 class 14-template_第4页
C++面向对象程序设计双语教程(第3版)课件 class 14-template_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论