C -template1-13

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

西安交通大学C++语言13模板主讲:郑卫斌weibin.zheng@gmail.com2西安交通大学模板与通用(Generic)编程很多算法是通用的,不依赖于数据类型。通用编程——编写独立于类型的代码,实现代码重用。//求整型的绝对值intabs(intvalue){returnvalue0?value:-value;}//求double型的绝对值doubleabs(doublevalue){returnvalue0?value:-value;}两个函数功能与实现方法都几乎一样只是类型不同。C++的函数模板可简化程序表达。3西安交通大学templateclassT//使用函数模板;T为类型参数Tabs(Tvalue){returnvalue0?value:-value;}函数模板其中T代表函数模板中要使用的通用类型,在函数的调用过程中,T被具体化。intx=abs(-10);//T实例化为intdoubley=abs(2342.10);//T实例化为double4西安交通大学模板分为函数模板和类模板。它们分别允许用户定义模板函数和模板类。模板模板函数模板(函数模板和类模板)实例化模板类实例化对象实例化模板可实现类型参数化,即把类型定义为参数,从而实现良好的代码重用性。5西安交通大学函数模板的声明与调用templateclassTReturnTypefunctionName(模板形参表){…}或者templatetypenameTReturnTypefunctionName(模板形参表){…}•template声明模板的关键字•class/typename后是模板形参函数模板的调用形式:函数名(实参数表);6西安交通大学1.#includeiostream2.templateclassT3.Tmax(Tx,Ty){4.return(xy)?x:y;5.}7.intmain(){8.inta=6,b=8;9.floatc=8.5,d=2.2;10.doublee=21.123,f=145.987;11.charg=‘z’,h=‘m’;12.coutmax(a,b)endl;//函数模板实例化13.coutmax(c,d)endl;14.coutmax(e,f)endl;15.coutmax(g,h)endl;16.}【例1】求最大值函数模板7西安交通大学main()利用函数模板生成了四个模板函数:max(a,b)用实参int将模板类型参数T实例化;max(c,d)用实参float对T实例化;max(e,f)用实参double对T实例化;max(g,h)用实参char对T实例化程序输出结果?函数模板的实例化8西安交通大学函数模板max(x,y)模板函数max(i1,i2)(i1,i2为整型)模板函数max(f1,f2)(f1,f2为浮点型)模板函数max(d1,d2)(d1,d2为双精度型)模板函数max(c1,c2)(c1,c2为字符型)实例化实例化实例化实例化上例中,函数模板max(x,y)根据传入的参数类型不同,生成了四个模板函数9西安交通大学函数模板是模板定义,使用通用参数类型,是一个代码框架,但无实际的函数代码。模板函数是函数模板的实例化。是实实在在的函数定义,具有函数代码。模板函数由C++编译系统在遇到具体函数调用时,依据函数模板生成。函数模板代表了一类函数,是抽象的;模板函数表示某一具体的函数。函数模板和模板函数10西安交通大学函数模板的使用说明(1)函数模板允许使用多个类型的参数。templateclassT1,classT2//两参数的函数模板voidmyfunc(T1x,T2y){coutx““yendl;}(2)函数模板可以具有确定数据类型的参数templateclassTTfunc2(Targ1,intarg2){…}11西安交通大学voidoutdata(inti){couti;}voidoutdata(doubled){cout”d=”dendl;}//因为它们输出的内容和格式有所区别。(3)函数模板某些方面类似于重载函数。但重载的每个函数可执行不同动作而同一函数模板实例化的所有模板函数都执行相同动作12西安交通大学1.templateclassT2.Tmax(Tx,Ty){3.return(xy)?x:y;4.}5.voidfunc(inti,charc){6.max(i,i);//正确,调用max(int,int)7.max(c,c);//正确,调用max(char,char)8.max(i,c);//错误,类型不匹配9.max(c,i);//错误,类型不匹配10.}(4)函数模板中的模板参数T可实例化为各种类型,但实例化T的各模板参数必须完全一致。在这种情况下,函数模板中没有隐式的类型转换。13西安交通大学【例2】求幂函数模板1.#includeiostream2.usingnamespacestd;3.templateclassT4.TPower(Ta,intexp){5.Tr=a;6.while(--exp0)r*=a;7.returnr;8.}9.intmain(){10.cout3^5=Power(3,5)endl;11.cout1.1^2=Power(1.1,2)endl;12.return0;13.}运算结果:3^5=2431.1^2=1.2114西安交通大学【例3】顺序查找算法1.#includeiostream2.templateclassT3.intseq_search(Ta[],constT&k,intn){4.for(inti=0;in;i++)5.if(k==a[i])returni;6.return-1;7.}8.intmain(){9.intia[]={3,2,5,0,-1,7};10.doubleda[]={3.3,2.1,0.3,1.5,10.6,5.2};11.char*cs=xjtu;12.std::coutseq_search(ia,15,6)std::endl;13.std::coutseq_search(da,3.3,5)std::endl;14.std::coutseq_search(cs,'j',4)std::endl;15.return0;16.}15西安交通大学模板函数与重载的调用顺序在C++中,函数模板与同名的非模板函数重载时,调用顺序遵循下述约定:1.寻找一个参数完全匹配的函数,如果找到就调用它。2.寻找一个函数模板,将其实例化,产生一个匹配的模板函数。若找到了,就调用它。3.若1和2都失败,再试一试低一级的对函数的重载方法。例如通过类型转换可产生参数匹配等,若找到了,就调用它。若1,2,3均未找到匹配的函数,则是一个错误的调用。如果在第1步有多于一个的选择,那么这个调用是意义不明确的,是一个错误调用。16西安交通大学作业101.写一个排序算法sort的函数模板,对类型T的数组进行升序排序。并将T实例化为int,double,char*,String,Date等类型进行测试。提示:对自定义类型String和Date,需要实现(哪个?)操作符重载。char*的排序结果满足你的要求么?

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功