13.面向对象程序设计课件.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
13.面向对象程序设计课件

模 板; 考虑:返回两个参数中较大者的函数 max(x,y)。x,y是具有可比较次序的任何类型。但是,C++是强类型语言,它要求参数x,y的类型在编译时就声明。这样就需要max( )函数的许多版本,每个版本的算法相同,形参代表的数据类型不相同。 int max(int x,int y); long max(long x,long y); …….等等 针对这种情况,采用函数模板,只需对函数模板编写一次,然后基于调用函数时提供的参数类型,C++编译器将自动产生相应的函数来正确处理该类型的数据。; 函数模板的定义形式是: templateclass T或templatetypename T 类型名 函数名(参数表) { 函数体的定义 } 模板头以关键字template开始,后面跟尖括号中的一个或多个模板形式参数。模板参数可以是类型,也可以是非类型的数据。 1 类型参数:特殊的表示法“class T”或“typename T”表示T是一个类型参数,它可以给定任何类型作为值。在标准C++中关键字“class”和“typename”可以交换。 2 非类型参数:正常格式的参数。例:int k ;例如: templateclass T T max(T x,T y) { return (xy)?x:y ;} void f( ) { int i; Myclass a,b; int j=max(i,0); //模板实参为整型 Myclass m=max(a,b); //模板实参为Myclass } ;这里生成了两个模板函数max(i,0)和max(a,b) max(i,0)用模板实参int将类型参数T实例化,而max(a,b)将T实例化为类类型Myclass。注意编译器将根据上下文关系非常仔细地调用适当的“”,根据运算符重载,在Myclass类声明中,应提供一个重载的operator( )函数。; templatetypename T T power(T a,int exp) { T ans=a; while(--exp0) ans*=a; return ans; } templatetypename T,int N T max(T arr[N]) { T ans=arr[0]; for(int i=1;iN;i++) ans=(ansarr[i])?ans:arr[i]; return ans; }; main( ) { int i=5,j=2; double b=1.25; coutpower(j,i)endl; //T是int coutpower(b,i)endl; //T是double int a[]={1,2,3}; coutmax(a)endl; //T是int,N=3 }; 注意:模板参数在下面的两个声明中没有区别 templatetypename T1,typename T2 int function(T1,T2); templateclass T1,class T2 int function(T1,T2); ; 一个函数模板提供一类函数的抽象,它以任意类型T为参数。由一个函数模板产生的函数称为模板函数,它是函数模板的具体实例。(类似于类与对象的关系) ; 重载函数模板 在一些特殊情况下,可能需要函数模板参与重载,C++允许函数模板被一个或多个同名的非模板函数重载。 templateclass T T max(T a,T b) { return (ab)?a:b; } void f(int i,char c ) { max(i,c); } //错误!max(int,char)无法匹配 问题在于模板类型并不知道int和char之间可以进行隐式类型转换。为了解决这个问题,C++允许函数模板可以参与重载;在C++中,函数模板与同名的非模板函数的重载方法遵循以下约定: (1) 寻找一个参数完全匹配的函数,若找到,就调用它 (2) 寻找一个函数模板,将其实例化产生一个匹配的模板函数,如果找到,就调用它。 (3) 寻找低一级的对函数的重载方法,若通过类型转换可产生参数匹配的函数,就调用它。 若 (1)(2)(3)均未找到匹配

文档评论(0)

baa89089 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档