c++primer函数模板ppt课件_第1页
c++primer函数模板ppt课件_第2页
c++primer函数模板ppt课件_第3页
c++primer函数模板ppt课件_第4页
c++primer函数模板ppt课件_第5页
已阅读5页,还剩27页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章第六章 模模 板板6.1 模板的概念模板的概念6.2 函数模板与模板函数函数模板与模板函数6.3 类模板和模板类类模板和模板类 模板是面向对象多态性的一种表现,1990年ANSI C+委员会将模板确定为组成部分,Borland C+ 3.0以上和Visual C+都支持模板。模板包括函数模板和类模板。一、为什么要引入模板? 模板的引入一个最重要的目的就是简化编程。由于C+是强类型语言,许多类似功能(函数或类)只要数据类型不同,就必须定义多份,不但使源程序增长,工作量也加大。例如,设计一个求两参数最大值的函数,不使用模板时,需要定义四个函数:int max(int a,int b)retu

2、rn(ab)?a:b;float max(float a,float b)return(ab)?a:b;double max(double a,double b)return(ab)?a:b;char max(char a,char b)return(ab)?a:b;这些函数的功能甚至语句都类似,能否只写一套代码,使用与多种数据类型呢?6.1 模板的概念6.1 模板的概念 解决的答案就是模板,通过类型参数化来实现代码重用即把数据类型定义为参数,使用时才给出具体类型来实例化类型参数。模板分为 函数模板(function template)和类模板(class template)。函数模板模板函数

3、实例化类模板模板类实例化模板模板函数模板类对象实例化实例化实例化实例化图图6.1 模板、模板类、模板函数和对象之间的关系模板、模板类、模板函数和对象之间的关系实例化实例化6.1 模板的概念 所谓函数模板,就是写一个函数模子,用这个模子套印出许多功能相同,参数类型和返回类型不同的函数。 模板函数:函数模板实例化后的具体函数。6.2 函数模板与模板函数6.2.1 函数模板的声明与模板函数的生成函数模板的声明格式如下:template 返回类型 函数名模板形参表) 函数体type是模板形参,在使用函数模板时,必须将其实例化,即用实际的数据类型替代它。6.2 函数模板与模板函数函数max()若使用模板

4、,则只定义一个函数:template type max(type a,type b)return(ab)?a:b; 函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。该定义只是对函数的描述,表示它每次能单独处理在类型形式参数表中说明的数据类型。6.2 函数模板与模板函数/例6.1 #include template max(T x,T y) return (xy)?x:y; main() int i1=10,i2=56; float f1=12.5,f2=24.5; double d1=50.344,d2=4656.546; char c1=k,c2=n;6.2 函数模板与模

5、板函数cout“the max of i1,i2=“max(i1,i2)endl;cout“the max of f1,f2=“max(f1,f2)endl;cout“the max of d1,d2=“max(d1,d2)endl;cout“the max of c1,c2=“max(c1,c2)y)?x:y;float max(float x,float y)return(xy)?x:y;double max(double x,double y)return(xy)?x:y;char max(char x,char y)return(xy)?x:y;结果:结果:the max of i1,

6、i2=56the max of f1,f224.5the max of d1,d2=4656.546the max of c1,c2=n函数模板函数模板max(T x,T y)max(T x,T y)模板函数模板函数1 1max(i1,i2)max(i1,i2)实例化实例化1 1T-intT-int模板函数模板函数2 2max(f1,f2)max(f1,f2)实例化实例化2 2T-floatT-float模板函数模板函数3 3max(d1,d2)max(d1,d2)实例化实例化3 3T-doubleT-double模板函数模板函数4 4max(c1,c2)max(c1,c2)实例化实例化4 4

7、T-charT-char函数模板:一组函数的抽象函数模板:一组函数的抽象模板函数:一个具体的函数模板函数:一个具体的函数代码重用,提高了程序设计的效率代码重用,提高了程序设计的效率例例6.2:#include template T sum(T *array, int size=0) T total=0; for(int i=0;isize;i+) total+=arrayi; return total; ; int int_array=1,2,3,.,10; double double_array=1.1,2.2,9.9,10.10; void main() int itotal=sum(in

8、t_array,10); double dtotal=sum(double_array,10); cout“The sum of int array are:”itotalendl; cout“The sum of double array are:”dtotalendl; 结果:结果:The sum of int array are:55The sum of double array are:59.6n说明:n(1)在函数模板中允许用多个类型参数。注意定义形式: 每个模板形参前必须加关键字class。n 例:template n void myfun(T1 x,T2 y)n coutx ym

9、yfun(int,char*)n myfun(0.12345,10L); -myfun(double,long int)n(2)在模板template 语句和函数模板定义之间不能有别的语句。6.2 函数模板与模板函数6.2.2 6.2.2 函数模板的异常处理函数模板的异常处理实例化T的各模板实参之间必须保持完全一致的类型,否则会发生错误。 template max(T x,T y) return (xy)?x:y; void fun(int i,char c) max(i,i); /ok max(c,c); /ok max(i,c); /error 无法匹配 max(c,i); /error模

10、板没有隐含的模板没有隐含的类型转换功能类型转换功能(1)采用强制类型转换采用强制类型转换 max(i,int(c);(2重载函数模板重载函数模板 template max(T x,T y) return (xy)?x:y; int max (int ,int);只声明原型只声明原型 void fun(int i,char c) max(i,i); /ok call max (int ,int); max(c,c); /ok call max (char ,char); max(i,c); /ok call max (int ,int); max(c,i); /ok call max (int

11、,int);支持隐式类支持隐式类型转换型转换定义一个完整的非模板函数定义一个完整的非模板函数#include#include#include#includetemplatetemplateT max(T x,T y)T max(T x,T y)return (xy)?x:y;return (xy)?x:y;charchar* * max(char max(char* * x,char x,char* * y) y)return (strcmp(x,y)0?x:y);return (strcmp(x,y)0?x:y);void main()void main() coutMax(Hello,Go

12、ld)is“max(HecoutMax(Hello,Gold)is“max(Hello,Gold)endl;llo,Gold)endl; 结果:结果:Max(Hello,Gold) is HelloMax(Hello,Gold) is Hello该例中,调用的是非模板函数该例中,调用的是非模板函数charchar* * max(charmax(char* *,char,char* *) )C+中函数调用的一般顺序为:(1)寻找一个参数完全匹配的函数,若找到则调用之,否则(2)寻找一个函数模板,若找到则将其实例化为一个模板函数,然后调用之,否则(3)寻找重载函数,考察有无可通过类型转换产生参数匹

13、配的函数,若有则调用之。 先配外部再配模板再配模板最后转换配外部最后转换配外部6.2.2 6.2.2 函数模板的异常处理函数模板的异常处理n类模板 (也称为类属类或类生成类)是:允许用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数或者返回值,能取任意数据类型。n template n class n /类说明体 n ;n 模板类:类模板实例化成一个具体的类;n 类名 对象名。6.3 类模板与模板类例:堆栈类模板 const int size=10; template class Stack T stksize; /堆栈元素类型可变 int top; /记录元素个数,int型不变

14、public: Stack() top=0; /创建 void push( T ob); /元素入栈 T pop( ); /元素出栈;类体外成员函数定义格式: template 返回类型 类名 :函数名(参数表) 函数体 在类体外定义成员函数时,若其中用到模板形参,则需要在函数体前进行模板声明,函数名前的类名之后也要缀上。例:template void Stack:push( T ob) if(top=size) cout“Stack full”; return ; else stktop=ob; top+; template void Stack:pop() if(top=0) cout“S

15、tack empty”; return ; top-; return stktop; 例:堆栈类模板使用int main( ) Stack s1,s2; /Stack s1,s2; s1.push(a); s1.push(b); s1.push(c); s2.push(x); s2.push(y); s2.push(z); cout“pop s1:”; for(int i=0;i3;i+) couts1.pop(); cout“pop s2:”; for(int i=0;i3;i+) couts2.pop(); return 0;结果:pop s1:cba pop s2:zyx类模板类模板St

16、ackStack模板类模板类1 1StackStack实例化实例化1 1T-charT-char模板类模板类2 2StackStack实例化实例化2 2T-intT-int模板类模板类3 3StackStack实例化实例化3 3T-doubleT-doublen使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型包括系统预定义的和用户自定义的)#include templatevoid sort(T *array,int len) T temp; for(int i=0;ilen-1;i+) for(int j=i+1;jlen;

17、j+)if(arrayiarrayj) temp=arrayi; arrayi=arrayj; arrayj=temp;template void show(T *array,int len) for(int i=0;ilen;i+) coutarrayi ; coutendl; int main() int test1=21,23,13,42,58; float test2=102.3,45.6,763.29; show(test1,5); sort(test1,5); show(test1,5); show(test2,3); sort(test2,3); show(test2,3); r

18、eturn 0; 21 23 13 42 5858 42 23 21 13102.3 45.6 763.29763.29 102.3 45.6#include templateclass array T content100; int len; public: array(T*,int); void sort(); void show();templatearray:array(T *t,int l) for(int i=0;il;i+) contenti=ti; len=l; templatevoid array: sort() T temp; for(int i=0;ilen-1;i+) for(int j=i+1;jlen;j+)if(contenticontentj) temp=contenti; contenti=contentj; contentj=temp; template void array:show() for(int i=0;ilen;i+) coutcontenti ; coutendl; int main() int test1=21,23,13,42,58; float test2=102.3,45.6,763.29; array a1(test1,5); arraya2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论