您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++程序设计基础模板pp8
2020年1月19日1第九章Templates2020年1月19日2一、模板函数的定义模板函数即是利用模板的概念来编写函数,让函数能够以相同的代码程序处理不同的数据类型。定义格式如下:templateclasstypeTypefun(Type,Type,…){…}该定义格式有两部分内容:①templateclasstype//template的定义部分关键字template表示:所定义的函数为模板函数;关键字class表示:模板函数接受的数据类型可以是任何数据类型,包括用户定义的数据类型(不是类的概念);Type:template的形式参数,表示模板函数的形式数据类型;classType为关键字template的参数行。2020年1月19日3一、模板函数的定义②Typefun(Type,Type,…){…}//函数定义部分Type:为经模板定义后形式数据类型,真正的数据类型含义取决于调用模板函数实参的数据类型。编译器决定Type的依据是当调用函数时所给出的实在参数而非函数的返回值类型。2020年1月19日4•Prog9_1.cpptemplateclassXXmax(Xvar1,Xvar2){return(var1var2)?var1:var2;}voidmain(){intm1=max(100,200);doublem2=max(35.5,65.6);char*m3=max(Micro,Soft);coutThemaxiumof100and200is:m1endl;coutThemaxiumof35.5and65.6is:m2endl;coutThemaxiumofMicroandSoftis:m3endl;getch();}运算结果:Themaxiumof100and200is:200Themaxiumof35.5and65.6is:65.6ThemaxiumofMicroandSoftis:Soft2020年1月19日5•Prog8_2.cpptemplateclassTTsum(T*array,intsize=0){Ttotal=0;for(inti=0;isize;i++)total+=array[i];returntotal;}intintarray[]={1,2,3,4,5,6,7,8,9,10};doubledouarray[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.0};intitotal=sum(intarray,10);doubledtotal=sum(douarray,10);voidmain(){coutThesummaryofintegerarryare:itotalendl;coutThesummaryofdoublefloatingarrayare:dtotalendl;}运行结果:Thesummaryofintegerarryare:55Thesummaryofdoublefloatingarrayare:59.52020年1月19日6二、template函数的重载利用template函数的参数表不同便可以实现模板函数的重载。Overlodingtemplate不仅可以解决参数数据类型不同的问题,也解决了参数个数不同的问题。如:templateclasstypeTypeadd(Typea,Typeb){…}templateclasstypeTypeadd(Typea,intb){…}templateclasstypeType*add(Typea,char*b){…}2020年1月19日7•Prog9_3.cpptemplateclassTTsum(T*array,intsize=0){staticTtotal;for(inti=0;isize;i++)total+=array[i];returntotal;}templateclassTTsum(T*array,T*array2,intsize=0){staticTtotal;for(inti=0;isize;i++)total+=array[i]+array2[i];returntotal;}2020年1月19日8intintarr1[]={1,2,3,4,5,6,7,8,9,10};intintarr2[]={2,4,6,8,10,12,14,16};doubledouarr[]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.0};intmain(intargc,char*argv[]){intitotal=sum(intarr1,10);doubledtotal=sum(douarr,10);intiatotal=sum(intarr1,intarr2,8);coutitotal=itotalendl;coutdtotal=dtotalendl;coutiatotal=iatotalendl;return0;}运行结果:itotal=55dtotal=59.5iatotal=1082020年1月19日9三、特殊情况的处理在例一中:templateclassXXmax(Xvar1,Xvar2){return(var1var2)?var1:var2;}char*m3=max(Micro,Soft);………coutThemaxiumofMicroandSoftis:m3endl;当改为char*m3=max(“Soft”,“Micro”);时输出结果为:ThemaxiumofMicroandSoftis:Micro2020年1月19日10指针变量m3的内容并非预期的“soft”。问题出在,当max函数的参数为字符串变量时,则类型参数Type被编译器解释成char*,函数max则被解释成:char*max(char*var1,char*var2){return(var1var2)?var1:var2;}此时形式参数var1与var2的内容分别为两字符串的起始地址,且由于参数var2定义在var1后,所以其存储器中的地址便比var1所占的存储器地址来的高,比较的结果永远是var2大于var1。2020年1月19日11解决问题的办法是设计一与template函数同名称的特别函数,参数表与template一样,但要明确给出参数类型。如:templateclassXXmax(Xvar1,Xvar2){return(var1var2)?var1:var2;}char*max(char*str1,char*str2){return(strcmp(str1,str2)=0)?str1:str2;}2020年1月19日12四、多重类型参数函数定义格式:templateclassType1,classType2Type1fun(Type1a,Type2b){…}说明:Class关键字不能省;每一个已定义的类型参数都必须至少被使用一次。如intm1=max(100,35.50);intm2=max(‘A’,30);2020年1月19日13五、Template类定义格式:templateclassTypeclassnewclass{…}定义成员函数时,必须以关键字template开始,然后接类型参数列表。定义在类体为时,必须以范围运算符指明其所属范围。必须加上类型参数以分辩成员函数将来是属于此template类的那一个类型。定义模板类对象的格式:NewclassTypenewclass_object;Type为用户指定的数据类型。2020年1月19日14如:templateclassTclassA{protected:Ty;public:A(Tx){y=x;}voidshow(){cout“y=“yendl;}}voidmain(){Aintaa(10);aa.show();charcc=‘a’;Acharbb(cc);bb.show();}2020年1月19日15•Prog9_5.cppconstintAS=20;templateclassTypeclassArray{private:Type*element;intsize;public:Array(constintsize);~Array();Type&operator[](constintindex);voidoperator=(Typetemp);};templateclassTypeinlineArrayType::Array(constints){size=s;element=newType[size];for(inti=0;isize;i++)element[i]=0;}templateclassTypeinlineArrayType::~Array(){deleteelement;}templateclassTypeType&ArrayType::operator[](constintindex){returnelement[index];}templateclassTypevoidArrayType::operator=(Typetemp){for(inti=0;isize;i++)element[i]=temp;}2020年1月19日16•Prog9_5.cppvoidmain(){Arrayintiobj(AS);Arraydoubledobj(AS);Arraycharcobj(AS);cout.flags(ios::showpoint);for(inti=0;iAS;i++){iobj[i]=i;dobj[i]=i;}cobj='c';for(i=0;iAS;i++){coutsetw(3)iobj[i]setw(15)dobj[i]cobj[i]endl;}}2020年1月19日17运行结果:00.000000c11.00000c22.00000c33.00000c44.00000c55.00000c66.00000c77.00000c88.00000c99.00000c1010.0000c1111.0000c1212.0000c1313.0000c1414.0000c1515.0000c1616.0000c1717.0000c1818.0000c1919.0000c2020年1月19日18六、template类的friend函数template类的friend函数有三种:1.一般friend函数如friendvoiddisplay(constintsize);2.第一种templatefriend函数TemplateclassTypeclassArray{friendvoiddisplay(constArrayType&arr);friendTypeget(constArrayType&arr,constintindex);…}2020年1月19日19六、template类的friend函数3.第二种templatefriend函数templateclassTypeclassArray{templateclassFTfriendvoiddisplay(ArrayFT&arr);templateclassFTfriendTypeget(co
本文标题:C++程序设计基础模板pp8
链接地址:https://www.777doc.com/doc-3163632 .html