C++铁道出版社第2版第八章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C++铁道出版社第2版第八章.ppt》由会员分享,可在线阅读,更多相关《C++铁道出版社第2版第八章.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+铁道出版社第铁道出版社第2版版第八章第八章8/10/20222第4章 串 8.1 模板的概念 定义求最大值函数max(): int max(int x,int y) return (xy)?xy; float max(float x,float y) return (xy)?xy; double max(double x,double y) return (xy)?xy; 这些函数的功能都是相这些函数的功能都是相同的,只是同的,只是参数类型参数类型和函和函数数返回类型返回类型不同不同 问题:能否问题:能否将这些函数合将这些函数合起来,只写起来,只写一一个个通用函数通用函数呢呢?8/10/2
2、0223第4章 串 解决这个问题的方法: 使用模板 模板是实现代码重用机制的一种工具, 它把类型定义为参数,实现类型参数化。 调用时,T 可以分别取为int 、float 、double 把把类型类型定义为参数,如下所示:定义为参数,如下所示: T T max( max(T T x x,T T y) y) return (xy) return (xy)?xyxy; 类型参数类型参数8/10/20224第4章 串 int max(int x,int y) return (xy)?xy; float max(float x,float y) return (xy)?xy; double max(d
3、ouble x,double y) return (xy)?xy; 把类型定义为参数,如下所示: T max(T x,T y) return (xy)?xy; 类型参数类型参数调用时调用时, ,T T取取intint调用时调用时, ,T T取取floatfloat调用时调用时, ,T T取取doubledouble 8/10/20225第4章 串 函数模板 模板 类 模 板 8/10/20226第4章 串 8.2.1 函数模板的声明 函数模板可声明如下: 函数模板也可以定义成如下形式: templatetemplate 返回类型返回类型 函数名函数名( (模板形参表模板形参表) ) 函数体函数
4、体 使用函数模板时使用函数模板时, , 类型参数类型参数必须实例化必须实例化, ,即用即用实际的数据类型实际的数据类型替代它。替代它。 templatetemplate是一是一个声明模板的关键个声明模板的关键字,它表示声明一字,它表示声明一个模板。个模板。 templatetemplate 返回类型返回类型 函数名函数名( (模板形参表模板形参表) ) 函数体函数体 8/10/20227第4章 串例如,求最大值函数模板,如下所示: template T max(T x,T y) return (xy)?xy;也可以定义成如下形式: template T max(T x,T y) return
5、(xy)?xy; T T为类型参数为类型参数 模板形参表模板形参表 8/10/20228第4章 串8.2.2 函数模板的使用 函数模板代表的是一类函数,使用时,类型参数必须实例化,即用实际的数据类型(既可以是系统预定义的标准数据类型(int 、float 、double等), 也可以是用户自定义的类型)替代它。 将函数模板中的类型参数实例化的参数称为模板实参。 用模板实参实例化的函数称为模板函数。 当编译系统发现有一个函数调用: 函数名(模板实参表);时,将根据模板实参表中的类型生成一个函数即模板函数。该模板函数的函数体与函数模板的函数体相同。8/10/20229第4章 串/例例8.1-18.
6、1-1#include#includeusing namespace std;using namespace std;template template T T max( max(T T x,x,T T y) y) return (xy) ? x:y; return (xy) ? x:y;main( )main( ) int int i1=10, i2=56; i1=10, i2=56; floatfloat f1=12.5, f2=24.5; f1=12.5, f2=24.5; double double d1=50.344, d2=4656.346;d1=50.344, d2=4656.3
7、46; charchar c1=k,c2=n; c1=k,c2=n; coutthe max of i1,i2 is: coutthe max of i1,i2 is:max(i1,i2)max(i1,i2)endl;endl; coutthe max of f1,f2 is: coutthe max of f1,f2 is:max(f1,f2)max(f1,f2)endl;endl; coutthe max of d1,d2 is: coutthe max of d1,d2 is:max(d1,d2)max(d1,d2)endl;endl; coutthe max of c1,c2 is:
8、coutthe max of c1,c2 is:max(c1,c2)max(c1,c2)endl;endl; return 0; return 0;函数模板函数模板 程序运行结果如下:程序运行结果如下:the max of i1,i2 is:56the max of i1,i2 is:56the max of f1,f2 is:24.5the max of f1,f2 is:24.5the max of d1,d2 is:4656.35the max of d1,d2 is:4656.35the max of c1,c2 is:nthe max of c1,c2 is:n 类型参数类型参数T
9、T 将将分别被类型分别被类型int int 、floatfloat 、doubledouble、charchar等取代等取代。8/10/202210第4章 串 可见:所谓函数模板,实际上是建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表。函数模板经实例化而生成的具体函数称为模板函数。 函数模板代表了一类函数, 模板函数表示某一具体的函数。8/10/202211第4章 串说明:(1) 在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename (或class )。例例8.3-1 8.3-1 建立了有两个类型参数的
10、函数模板。建立了有两个类型参数的函数模板。#include #include using namespace std;using namespace std;template typename template void myfunc( type1 x, type2 y)void myfunc( type1 x, type2 y) coutx yendl; coutx yendl;main()main() myfunc(10, hao); myfunc(10, hao); myfunc(0.123, 10L); myfunc(0.123, 10L); return 0; return 0;两个
11、类型参数两个类型参数type1type1和和type2type2 运行结果为:运行结果为: 10 hao10 hao 0.123 10 0.123 108/10/202212第4章 串 (2) 在template语句与函数模板定义语句之间不允许有别的语句。 例如下面的程序段就不能编译。 template int i; /错误 T max( T x,T y ) return ( xy)?xy; (3) 模板函数类似于普通重载函数,但更严格一些。 普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。 但同一函数模板实例化后的所有模板函数都必须执行相同的动作。8/10/202213第4章
12、 串 (3) (3) 模板函数类似于普通重载函数,但更严格一些。模板函数类似于普通重载函数,但更严格一些。 普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。 但同一函数模板实例化后的所有模板函数都必须执行相同的动作。 例如,下面的重载函数就不能用模板函数代替: 函数1: void outdate(int i) couti; 函数2: void outdata(double d) coutd=dendl; 因为它们所执行的动作是不同的。8/10/202214第4章 串 (4) (4) 同一般函数一样,函数模板也可以重载。同一般函数一样,函数模板也可以重载。#include /#i
13、nclude /例例8.4-18.4-1templatetemplateType max(Type x,Type y)Type max(Type x,Type y) return (xy)?x:y; return (xy)?x:y;template template Type max(Type x,Type y,Type z)Type max(Type x,Type y,Type z) Type t; Type t; t=(xy)? x:y; t=(xy)? x:y; return(tz)?t:z; return(tz)?t:z; main( )main( ) int m=10, n=20,
14、max2; int m=10, n=20, max2; float a=10.1, b=20.2, c=30.3, max3; float a=10.1, b=20.2, c=30.3, max3; max2=max(m,n);max2=max(m,n); max3=max(a,b,c);max3=max(a,b,c); coutmax(m,n)=max2endl; coutmax(m,n)=max2endl; coutmax(a,b,c)=max3endl; coutmax(a,b,c)=max3endl; return 0; return 0; 函数模板重载函数模板重载运行结果运行结果:
15、:max(10,20)=20max(10,20)=20max(10.1,20.2,30.3)=30.3max(10.1,20.2,30.3)=30.38/10/202215第4章 串 (5) 函数模板与同名的非模板函数可以重载。在这种情况下,调用的顺序是: 首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它; 若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。8/10/202216第4章 串#include /例例8.5-1 函数模板与非模板函数重载举例。函数模板与非模板函数重载举例。using namespace std;template /模板声明模
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 铁道 出版社 第八
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内