C++课件教学作者邱志杰第六章_模板.ppt

C++课件教学作者邱志杰第六章_模板.ppt

ID:51617171

大小:478.50 KB

页数:18页

时间:2020-03-26

C++课件教学作者邱志杰第六章_模板.ppt_第1页
C++课件教学作者邱志杰第六章_模板.ppt_第2页
C++课件教学作者邱志杰第六章_模板.ppt_第3页
C++课件教学作者邱志杰第六章_模板.ppt_第4页
C++课件教学作者邱志杰第六章_模板.ppt_第5页
资源描述:

《C++课件教学作者邱志杰第六章_模板.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第六章模板丘志杰电子科技大学计算机学院2021/9/172泛型程序设计C++最重要的特征之一就是代码重用,为了实现代码重用,代码必须具有通用性。通用的代码需要不受数据类型的影响,并且可以自动适应数据类型的变化,这种程序设计类型称为泛型程序设计。2021/9/173模板模板是C++支持泛型程序设计的工具,通过它可以实现参数化多态性。参数化多态性,就是将程序所处理的对象的类型参数化,使得一段程序可以处理多种不同类型的对象。模板分为:函数模板和类模板2021/9/174函数模板和模板函数问题的引入:写一个函数求两个值中的最大者。作为

2、强类型的语言,C++“不允许”也不应该对两种不同类型的数据进行比较。一般的解决办法就是写一系列的函数,来分别完成整型、浮点型和用户自定义类型的求解。intmax(intx,inty){…}floatmax(floatx,floaty){…}这些函数除了操作的数据类型不同之外,代码框架是一样的。这使程序代码变得累赘而加大维护难度。2021/9/175一个变通的方法是使用宏定义:#definemax(x,y)((x)>(y)?(x):(y))这样做虽然解决了代码维护问题,但是由于宏定义只是在编译时进行简单的宏展开,避开了类型检查机

3、制,因此可能带来一些难以发觉的错误。使用C++的模板可以轻松地解决上述问题,此时数据类型本身就是一个参数。2021/9/176关键字template后面的尖括号表明,max函数要用到一个叫做T的参数(我们称作模板参数),而这个参数是一种类型。例如max函数的模板可以定义为:templateTmax(Tx,Ty){returnx>y?x:y;}该模板的含义就是无论参数T为int、char或其他数据类型(包括类类型),函数max的语意都是对x和y求最大值。这样定义的max代表了一类具有相同程序逻辑的函数,称为函数模

4、板。2021/9/177函数模板本身是不被编译的,所以函数模板不能直接使用,必须被实例化(即给定类型参数T)后才能使用。例如:voidmain(){doublea=1.0,b;b=max(a,2.0);}在上面的代码中,函数模板接受了一个隐含的参数:double,编译器自动将函数模板扩展成一个完整的关于double数据比较大小的函数,然后再在函数模板被调用的地方产生合适的函数调用代码。由函数模板实例化出的函数称为模板函数。2021/9/178函数模板与模板函数的关系模板函数max(intx,inty)函数模板max(Tx,Ty

5、)模板函数max(doublex,doubley)模板函数max(Xx,Xy)实例化实例化实例化就像类和对象的关系一样,函数模板将具有相同正文的一类函数抽象出来,可以适应任意类型T。2021/9/179请思考对于上述的max函数模板,如果参与比较的是两个类对象,该怎么办?例如:Complexc1,c2,c3;c3=max(c1,c2);那么编译器将不能明白“>”运算符作用在类类型上是什么意思。在这种情况下,为了避免这个问题,必须为参与运算的类类型重载“>”运算符。2021/9/1710重载模板函数请思考下面情况:voidFun

6、c(intnum,charch){inta=max(num,ch);intb=max(ch,num);}此时为函数模板提供了两个不同的类型(int和char),编译器无法按模板的规则实例化出那样的函数。但是int和char直接的隐式类型转换是很普遍的。解决办法:C++允许一个函数模板可以使用多个模板参数或者重载一个函数模板。2021/9/1711例子:使用多个模板参数templateTmax(Tx,Dy){return(x>y)?x:y;}voidmain(){inta=9;charb=34;in

7、trr=max(a,b);}2021/9/1712例子:重载一个函数模板//在redhat下使用g++编译并执行下面程序templateTmax(Tx,Ty){return(x>y)?x:y;}intmax(intx,inty){return(x>y)?x:y;}voidmain(){intnum=1;charch=2;max(num,num);//调用max(int,int)max(ch,ch);//调用max(T,T)max(num,ch);//调用max(int,int)max(ch,num);//调用m

8、ax(int,int)}2021/9/1713类模板与模板类请看下面双向链表的例子:classnode{intvalue;node*prev,*next;public:node(){prev=NULL;next=NULL;}voidsetValue(intvalue){thi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。