电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C++面向对象程序设计 教学课件 ppt 作者 陈维兴 陈昕 C++邮电-8

28页
  • 卖家[上传人]:E****
  • 文档编号:89343032
  • 上传时间:2019-05-23
  • 文档格式:PPT
  • 文档大小:335KB
  • / 28 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、,第8章 模 板 8.1 模板的概念 8.2 函数模板 8.3 类模板,本章主要内容,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;,这些函数的功能都是相同的,只是参数类型和函数返回类型不同,问题:能否将这些函数合起来,只写一个通用函数呢?,解决这个问题的方法: 使用模板 模板是实现代码重用机制的一种工具, 它把类型定义为参数,实现类型参数化。 调用时,T 可以分别取为int 、float 、double,把类型定义为参数,如下所示: T max(T x,T y) return (xy)?xy; ,类型参数,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

      2、 (xy)?xy;,把类型定义为参数,如下所示: T max(T x,T y) return (xy)?xy; ,类型参数,调用时,T取int,调用时,T取float,调用时,T取double,函数模板 模板 类 模 板,8.2 函数模板 8.2.1 函数模板的声明 函数模板可声明如下: 函数模板也可以定义成如下形式:,template 返回类型 函数名(模板形参表) 函数体 ,使用函数模板时, 类型参数必须实例化,即用实际的数据类型替代它。,template是一个声明模板的关键字,它表示声明一个模板。,template 返回类型 函数名(模板形参表) 函数体 ,例如,求最大值函数模板,如下所示: template T max(T x,T y) return (xy)?xy; 也可以定义成如下形式: template T max(T x,T y) return (xy)?xy;,T为类型参数,模板形参表,8.2.2 函数模板的使用 函数模板代表的是一类函数,使用时,类型参数必须实例化,即用实际的数据类型(既可以是系统预定义的标准数据类型(int 、float 、double等), 也可

      3、以是用户自定义的类型)替代它。 将函数模板中的类型参数实例化的参数称为模板实参。 用模板实参实例化的函数称为模板函数。 当编译系统发现有一个函数调用: 函数名(模板实参表); 时,将根据模板实参表中的类型生成一个函数即模板函数。该模板函数的函数体与函数模板的函数体相同。,#include /例8.1 函数模板的使用。 using namespace std; template /模板声明,其中T为类型参数 T max(T a,T b) /定义函数模板,“T a,T b”为模板形参表 return (ab) ? a:b; int main() int i1=10, i2=56; double d1=50.344, d2=4656.346; char c1=k,c2=n; cout“较大的整数是:“max(i1,i2)endl; cout“较大的双精度型数是:“max(d1,d2)endl; cout“较大的字符是:“max(c1,c2)endl; return 0; ,类型参数T 将分别被类型int 、float 、double、char等取代,调用函数模板,此时T被char取代,调用函

      4、数模板,此时T被double取代,调用函数模板,此时T被char取代,运行结果如下: 较大的整数是:56 较大的双精度型数是:4656.35 较大的字符是:n,可见:所谓函数模板,实际上是建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表。函数模板经实例化而生成的具体函数称为模板函数。 函数模板代表了一类函数, 模板函数表示某一具体的函数。,说明: (1) 在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename (或class )。 例8.3-1 建立了有两个类型参数的函数模板。 #include using namespace std; template void myfunc( type1 x, type2 y) coutx yendl; main() myfunc(10, “hao“); myfunc(0.123, 10L); return 0;,两个类型参数type1和type2,运行结果为: 10 hao 0.123 10,(2) 在template语句与函数模板定义语句之间不允许有别的语句

      5、。 例如下面的程序段就不能编译。 template int i; /错误 T max( T x,T y ) return ( xy)?xy; (3) 模板函数类似于普通重载函数,但更严格一些。 普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。 但同一函数模板实例化后的所有模板函数都必须执行相同的动作。,(3) 模板函数类似于普通重载函数,但更严格一些。 普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。 但同一函数模板实例化后的所有模板函数都必须执行相同的动作。 例如,下面的重载函数就不能用模板函数代替: 函数1: void outdate(int i) couti; 函数2: void outdata(double d) coutd=dendl; 因为它们所执行的动作是不同的。,(4) 同一般函数一样,函数模板也可以重载。 #include /例8.3-1 template Type max(Type x,Type y) return (xy)?x:y; template Type max(Type x,Type y,Type z) Type t; t=

      6、(xy)? x:y; return(tz)?t:z; main( ) int m=10, n=20, max2; float a=10.1, b=20.2, c=30.3, max3; max2=max(m,n); max3=max(a,b,c); cout“max(“m“,“n“)=“max2endl; cout“max(“a“,“b“,“c“)=“max3endl; return 0; ,函数模板重载,运行结果: max(10,20)=20 max(10.1,20.2,30.3)=30.3,(5) 函数模板与同名的非模板函数可以重载。在这种情况下,调用的顺序是: 首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它; 若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。,#include /例8.4-1 函数模板与非模板函数重载举例。 using namespace std; template /模板声明,其中AT为类型参数 AT max(AT x,AT y) /定义函数模板 couty)? x:y; int max(int x,int y) /

      7、定义非模板函数max,与函数模板max重载 couty) ? x:y; int main() int i1=10, i2=56; double d1=50.34, d2=4656.34; cout“较大的整数是:“max(i1,i2)endl; cout“较大的双精度型数是:“max(d1,d2)endl; return 0; ,调用模板函数, 此时AT被double替代,调用非模板函数,#include /例8.4-1 函数模板与非模板函数重载举例。 using namespace std; template AT max(AT x,AT y) couty)? x:y; int max(int x,int y) /定义非模板函数max, 与函数模板max重载 couty) ? x:y; int main() int i1=10, i2=56; double d1=50.34, d2=4656.34; cout“较大的整数是:“max(i1,i2)endl; cout“较大的双精度型数是:“max(d1,d2)endl; return 0; ,程序运行结果为: 调用非模板函数:较大的整

      8、数是:56 调用模板函数:较大的双精度型数是:4656.34,8.3 类模板 所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型来代表。 使用类模板定义对象时,系统会根据实参的类型(模板实参)来取代类模板中虚拟类型从而实现了不同类的功能。,定义一个类模板,格式如下: 或,template class 类名 类成员声明 ;,template class 类名 类成员声明 ;,template是一个声明模板的关键字,Type是类型参数,例如,建立一个用来实现求三个数之和的类模板。 template / 模板声明,其中T为类型参数 class Add_3 / 类模板名为Add_3 public: Add_3(T a,T b,T c) x=a; y=b; z=c; T sum() return x+y+z; private: T x,y,z; ;,类型参数,在类声明中,欲采用通用数据类型的数据成员、成员函数的参数或返回类型前面需加上T。,用类模板定义对象时,采用以下形式: 使用上面求三个数之和的类模板的主函数可写成: int main()

      9、Add_3 sum3_1(3,5,7); Add_3 sum3_2(12.34,34.56,56.78); cout“三个数之和是:“ sum3_1.sum()endl; cout“三个数之和值是:“ sum3_2.sum()endl; return 0; ,类模板名 对象名; 类模板名 对象名(实参表列);,#include /例8.5 类模板Add_3的使用。 using namespace std; template / 模板声明,其中T为类型参数 class Add_3 / 类模板名为Add_3 public: Add_3(T a,T b,T c) x=a; y=b; z=c; T sum() return x+y+z; private: T x,y,z; ; int main() Add_3 sum3_1(3,5,7); Add_3 sum3_2(12.34,34.56,56.78); cout“三个整数之和是:“ sum3_1.sum()endl; cout“三个双精度数之和是:“ sum3_2.sum()endl; return 0; ,用类模板定义对象sum3_1,此时T被int替代,用类模板定义对象sum3_2,此时T被double替代,#include /例8.5 类模板Add_3的使用。 using namespace std; template / 模板声明,其中T为类型参数 class Add_3 / 类模板名为Add_3 public: Add_3(T a,T b,T c) x=a; y=b; z=c; T sum() return x+y+z; private: T x,y,z; ; int main() Add_3 sum3_1(3,5,7); Add_3 s

      《C++面向对象程序设计 教学课件 ppt 作者 陈维兴 陈昕 C++邮电-8》由会员E****分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 陈维兴 陈昕 C++邮电-8》请在金锄头文库上搜索。

      点击阅读更多内容
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.