C++Cha6.doc_第1页
C++Cha6.doc_第2页
C++Cha6.doc_第3页
C++Cha6.doc_第4页
C++Cha6.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

C+面向对象程序设计教程(二版)讲稿第6章 模板(书P222)一、模板的慨念C+的一个重要特性是支持重用的类属机制。类型、变量、函数均可以参数化。模板是C+支持参数化多态性的工具。所谓参数化多态性,即是将一段程序所处理的对象的类型参数化。这样,这段程序就可以处理某个类型范围之内的各种类型的对象。这些类型呈现某种共同结构。由于C+程序结构的主要构件是类和函数,所以模板在C+中有函数模板和类模板。它们分别允许用户构造模板函数和模板类。函数模板具体使用时要以具体类型实例化函数。实例化即用具体类型替代它,实例化后称为模板函数。同理,类模板经过实例化后称为模板类。它们的关系如书P223图6.1所示模板(函数模板和类模板) 实例化 实例化模板类模板函数实例化对象C+ 6章_P1二、函数模板与模板函数1、引入考察下面求绝对值重载函数声明: int abs( int x ) /适用于整型 return ( x 0 ) ? x : x ;或double abs( double x ) /适用于双精度型 return ( x 0 ) ? x : x ;函数abs( )被重载用于求整型(int)和双精度(double)浮点数求绝对值。这些函数的参数个数,函数执行功能相同,即实现代码也相同。由于参数类型不同要重写,浪费许多重复劳动。如果将int和double类型参数化,就可以得到通用的求绝对值代码段: Template T abs( T x ) return ( x 0 ) ? x : x ;C+ 6章_P2这样当需要求某整数或双精度数绝对值时,只需将T用int或double替换即可。还可以计算其它类型的绝对值。这种类型参数化避免了程序员大量的重复劳动,增加程序的灵活性。2、函数模板定义的一般格式:Template 返回值类型 函数名( 模板形参表 ) 函数体 其中,Template是一个声明模板的关键字,表示声明一个模板。例如,书P223求最大值函数max()定义成函数模板:Template T max( T x, T y ) return ( x y ? x : y ); 也可写成:Template T max( T x, T y ) return ( x y ? x : y ); C+ 6章_P3其中,T为类型参数,它既可取系统预定义的数据类型,又可以是用户自定义的类型。而T前加关键字class(或 typename)标志T是类型参数类型。类型参数T必须实例化,即用实际的数据类型替代它。例6.1(书P224)#include /输入输出流头文件#include /字符串头文件template /类型参数 ATAT max( AT x , AT y ) return ( x y ) ? x : y ; main() /主函数int i1 = 10 , i2 = 56; /定义三个整型变量float f1 = 12.5 , f2 = 24.5 ;double d1 = 50.344 , d2 = 4656.346 ;char c1 = k , c2 = n ;cout the max of i1 , i2 is: max( i1 , i2 ) endl ; /用 int 实例化类型参数 ATcout the max of f1 , f2 is: max( f1 , f2 ) endl ; /用 float 实例化类型参数 ATcout the max of d1 , d2 is: max( d1 , d2 ) endl ; /用 double 实例化类型参数 ATcout the max of c1 , c2 is: max( c1 , c2 ) endl ; /用 char 实例化类型参数 ATreturn 0 ;例6_1_1C+ 6章_P4程序的运行结果为:the max of i1 , i2 is: 56the max of f1 , f2 is: 24.5the max of d1 , d2 is: 4656.35 the max of c1 , c2 is: n从上例看到,函数模板提供了一类函数抽象,它以任意类型AT为参数及函数返回值类型。函数模板经实例化而生成的具体函数称为模板函数。函数模板代表了一类函数,模板函数则表示某一具体的函数。书P225图6.2是本例函数模板和模板函数关系。 函数模板实现了函数类型参数的通用性,作为一种代码的重用机制可以大幅度提高程序设计的效率。例6.2(书P224)模板函数的应用#include /输入输出流头文件template /类型参数 TT sum( T * array , int size = 0 )T total = 0 ;for( int i =0 ; i size ; i+ )total += arrayi ;return total ; ;C+ 6章_P5int int_array = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;double double_array = 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10 ;void main() /主函数int itotal = sum( int_array, 10 ); double dtotal = sum( double_array, 10 );cout 整型数组总和是: itotal endl ; cout 双精确度数组总和是: dtotal endl ; 程序的运行结果为:整型数组总和是: 55双精确度数组总和是: 59.63、几点说明:(1)在函数模板中允许使用多个类型参数。此时模板的声明部分template定义部分的每一个模板形参说明为类型参数前必须有关键字class例6.3(书P225)#include /输入输出流头文件template void myfunc( type1 x, type2 y )cout x y endl ; ;C+ 6章_P6main() /主函数myfunc( 10, hao ); myfunc( 0.123, 10L );return 0 ; 程序的运行结果为:10 hao0.123 10(2)在template语句与函数模板定义语句之间不允许插入语句或行。例书P226/this willnot compiletemplate int i ; /错误,不允许插入有别的语句T max( T x, T y ) return ( x y ) ? x : y ; 例6_1_2(3)模板函数类似于重载函数。只不过它更严格一些而已。但函数被重载时,在每个函数体内可以执行不同的动作,但同一个函数模板实例化后的所有模板函数都必须执行相同的动作。C+ 6章_P7三、类模板与模板类1、引入一个类模板(又称为类属类或类生成类)允许用户为类定义一种模式,使类中的某些数据成员和成员函数的参数或返回值可取任意数据类型。例如,实现堆栈类模板const int size=10;template /声明一个类模板,Type 模板类型名class stack /定义堆栈类Type stcksize; /数据成员数组可取任意类型,即模板参数类型 Typeint tos; /整型数据成员public:void init()/初始化成员函数 tos=0; void push( Type ch ) ; /压入成员函数push(),参数取模板类型 TypeType pop(); /弹出成员函数pop()返回类型取模板类型 Type;C+ 6章_P82、类模板定义的一般格式:Template Class 类名 /类体 ;其中,Template是一个声明模板的关键字,表示声明一个模板。关键字class (也可用typename)后面的Type是类型参数。在类定义时,类的数据成员或成员函数的参数或返回值要采用通用的数据类型,在其前面需加上Type例如,上面所举堆栈类模板在类外定义成员函数时,若此成员函数中有Type的类型参数存在,则需要在函数体外进行模板声明,并且在类名后,函数名前缀上“” C+ 6章_P9例如,上述堆栈成员函数push()和pop()在类外定义template /模板声明void stack :push( Type ob ) /类外定义压入成员函数push()。在类名后,函数名/要设置模板类型名if( tos = = size )cout 堆栈已满 ;return ;stcktos = ob ;tos+ ;C+ 6章_P10template /模板声明Type stack :pop() /类外定义弹出成员函数pop() ,在类名后,函数名/前置模板类型名if( tos = = 0 )cout 堆栈已空 ;return 0 ;Tos - - ;return stcktos ;3、类模板的使用类模板不代表一个具体的、实际的类,而代表一个类的类,实际上,类模板的使用就是将类模板实例化成一个具体的类。其格式为: 类名 对象名 ;例如,上述堆栈类模板,创建两个模板参数为char的对象,语句: stack s1,s2;C+ 6章_P11例6.4 (书P229)使用类模板stack的完整例子,例中建立了字符型和整型两个堆栈。#include const int size=10;template /声明一个类模板,Type 模板类型名class stack /定义堆栈类Type stcksize; /数据成员数组可取任意类型,即模板参数类型 Typeint tos; /整型数据成员public:void init() /初始化成员函数 tos=0; void push( Type ch ) ; /压入成员函数push(),参数取模板类型 TypeType pop(); /弹出成员函数pop()返回类型取模板类型 Type;C+ 6章_P12template /模板声明void stack :push(Type ob ) /类外定义压入成员函数push()。在类名后,函数名前要置模板类型名if( tos=size )cout 堆栈已满 ;return ;stcktos = ob ;tos+ ;C+ 6章_P13template /模板声明Type stack :pop() /类外定义压入成员函数pop() ,在类名后,函数名前置模板类型名if( tos=0 )cout 堆栈已空 ;return 0 ;tos- ;return stcktos ;C+ 6章_P14main() int i;stack s1,s2; /创建模板参数为 char 型的 2 个对象 s1,s2s1.init(); s2.init(); S1abcs1.push(a);s1.push(b);s1.push(c);for( i=0; i3 ; i+ )cout 弹出 s1: s1.pop() endl ;cout - endl; S2xyzs2.push(x); s2.push(y);s2.push(z);for( i=0; i3 ; i+ )cout 弹出 s2: s2.pop() endl ;C+ 6章_P15cout * endl;stack is1,is2; /创建模板参数为 int 型的 2 个对象 is1,is2is1.init(); S113

温馨提示

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

评论

0/150

提交评论