C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章 模板的程序设计

上传人:E**** 文档编号:89381743 上传时间:2019-05-24 格式:PPT 页数:22 大小:3.06MB
返回 下载 相关 举报
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章  模板的程序设计_第1页
第1页 / 共22页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章  模板的程序设计_第2页
第2页 / 共22页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章  模板的程序设计_第3页
第3页 / 共22页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章  模板的程序设计_第4页
第4页 / 共22页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章  模板的程序设计_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章 模板的程序设计》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第12章 模板的程序设计(22页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计,连卫民 主编,中国铁道出版社 2008.9,第12章 模板的程序设计,本章主要内容: 12.1 模板的基本概念 12.2 函数模板(重点) 12.3 类模板(重点) 12.4 上机实训 本章教学目标: 了解模板、函数模板和类模板的基本概念 熟悉重载模板函数的方法及函数模板与模板函数的区别 掌握函数模板和类模板的创建和使用方法,12.1 模板的基本概念,若一个程序的功能是对不同数据类型的数据进行同样的处理,则可以把这个程序定义成模板。 12.1.1 模板的概念 在程序设计中往往存在这样的现象:两个或多个函数的函数体完全相同,差别仅在于它们的参数类型或个数不同。例如: 解决这一问题的

2、一种方法是使用宏定义。 解决以上问题的另一个方法就是使用模板。模板是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正意义上的代码复用。,第12章 模板的程序设计,12.1 模板的基本概念,12.1.2 模板的分类 模板是一系列相关函数或类定义的模板或样板,提供了一类函数或类的抽象。 模板分类: 函数模板和类模板,它们分别允许用户构造模板函数和模板类。 图12-1显示了模板、模板函数、模板类和对象之间的关系。 说明: 一个函数模板表示了一组名字相同的函数,这些函数间是重载的关系,它以任意类型T为参数及函数返回值类型。 函数模板的引入实现了函数参数的通用性,作为

3、一种代码的复用机制,可以大幅度地提高程序设计的效率。,第12章 模板的程序设计,12.2 函数模板,12.2.1 函数模板的定义 template 或 类型名 函数名(参数表) 函数体 函数模板就像是一个带有类型参数的函数(参数T即为类型),编译程序会根据实际参数的类型确定参数的类型。例如(图),template 类型名 函数名(参数表) 函数体 ,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 1.函数模板和模板函数 已经定义的模板函数(象上节定义的max())代表的是一类函数,我们称之为函数模板。 将T实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数

4、。 【例12-1】函数模板的使用示例。 图12-2给出了函数模板和模板函数的关系。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 使用函数模板应遵循的原则: (1)在模板参数中指明的类型参数都必须用于参数表。例如: template T *create(T a,int size) / 正确 template T *create() / 错误 (2)在使用函数模板时,应保证函数的类型与模板函数的参数类型正好匹配,编译器不会给模板函数的参数提供任何形式的转换。例如,对上述定义的max函数模板: int m1=max(a,c) ; / 错误,编译器不会自动将c的char

5、转换为int (3)在引入模板后,重载函数的参数匹配规则为: 调用函数的参数与某一定义函数的参数正好匹配,则调用该函数; 如果能从某个模板函数生成参数匹配的函数,则调用该生成函数; 先对相应参数转换(内定义转换和用户自定以的转换)后执行匹配规则。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 2.有关指针的函数模板的使用 【例12-2】有关指针的函数模板的使用示例。 分析: 在该程序中,生成了两个模板,其中sum(int_array,10)用模板实参int_array将类型参数AT进行了实例化,int_array为一个整型的数组名,是一个指向int类型的指针; 而

6、sum(double_array,10)用模板实参double_array将类型参数AT实例化, double_array为一个双精度型的数组名,是一个指向double类型的指针。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 2.有关指针的函数模板的使用 说明: (1)在template语句与函数模板定义语句之间不允许有任何别的语句。例如: (2)模板函数类似于重载函数,只不过它更严格一些而已。函数被重载时,在每一个函数体内都可以执行不同的动作。但同一个函数模板实例化后的所有模板函数都必须执行相同的动作。例如,下面的重载函数就不能用模板函数代替,因为它们所执行的

7、动作是不同的。 (3)在函数模板中允许使用多个参数。但是应当注意template定义部分的每一个数据类型参数前必须有关键字class(或typename)。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 3.有两个类型参数的函数模板的使用 函数模板的形参表中可以有多个参数。 例如,max()模板也可以定义如下: template T1 max(T1 x,T2 y) return x(T1)y?x:(T1)y; 说明:在这个模板中,max()有了两个不同类型的参数,如一个是int型的,另一个是double型的。只要类型T1可以用“”比较大小,而且类型T2可以转换成类

8、型T1,就可以利用这个模板。 【例12-3】有两个类型参数的函数模板示例。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 4.用户自定义参数类型的函数模板的使用 可以在函数模板形参表和对模板函数的调用中使用类和其他用户自定义类型。如果这样,就必须在模板函数中对类对象产生作用的基本运算符进行重载。 【例12-4】用户自定义类型参数的函数模板示例。 说明: 上述程序定义了一个类Number。若函数max()用类Number进行实例化,它就必须要找出类Number两个对象中的较大者。为此,必须在类中重载运算符“”。 当我们用标准类型int参数来调用模板函数max()时,

9、使用系统提供的标准运算符“”而不是用重载过的运算符“”来比较两个整数。,第12章 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 5.函数模板的异常处理 函数模板有一个特点:虽然函数模板中的类型参数T可以实例化为各种类型,但是采用类型参数T的每一个参数都必须实例化成完全相同的类型。模板类型不具有隐式的类型转换。若不注意这一点,可能就会产生错误。请看下面的例子: 【例12-5】函数模板异常处理示例。 这里出现错误的原因是:函数模板中的参数类型只有到该函数真正被调用时才能决定。在调用时,编译器将按最先遇到的实参的类型隐含的生成一个模板函数,用它对所有模板进行一致性检查。,第12章

10、 模板的程序设计,12.2 函数模板,12.2.2 函数模板的使用 5.函数模板的异常处理 解决这个问题有以下几种方法: (1)采用强制类型转换,如将调用语句max(i,c);改成为:max(i,int(c)。 (2)用非模板函数重载函数模板,这种重载有两种表述方式: 只声明一个非模板函数的原型。此方式定义非模板函数重载模板函数时,只声明非模板函数的原型,而不给出函数体,它的函数体是借用函数模板的函数体。当执行此重载版本时会自动调用函数模板的函数体。例如: 定义一个完整的非模板函数。此方式定义的重载函数所带参数的类型可以随意,就象一般的重载函数一样定义。例如:,第12章 模板的程序设计,12.

11、3 类模板,使用类模板可以使用户为类定义一种模式,使类中的某些数据成员和成员函数以及成员函数的返回值取任意类型。 12.3.1 类模板的定义 1.类模板和模板类 类模板允许用户为类定义一个模式,使得类中的某些数据成员或者某些成员函数的参数或返回值能取任意数据类型。请看下列类的定义。(图) 说明: 类模板实例化后成为模板类(Template class),模板类是类模板对某一特定类型的实例化。 类模板代表了一类类,模板类表示某一具体的类。 模板类具有和普通类相同的行为,因此不仅可以用它来生成实例对象,也可以用它作为函数参数,为它定义指针或引用。 图12-3给出了类模板和模板类之间的关系。,第12

12、章 模板的程序设计,12.3 类模板,2.类模板的定义 格式: template class 类名 类体 ; 说明: “template”是一个定义模板的关键字,它表示定义一个模板。 关键字“class”(或typename)后面的“T”是类型参数。 在类定义中,欲采用通用数据类型的数据成员、成员函数的参数或返回值时需要在它们前面加上“T” 。 类模板不是代表一个具体的、实际的类,而是代表着一类类。,第12章 模板的程序设计,12.3 类模板,2.类模板的定义 例如:如图的程序段建立了一个用来实现堆栈的类模板。 在类定义体外定义成员函数时,若此成员函数中有模板形参存在,则需要在函数体外进行模板

13、声明,且在函数名前的类名后加上“”。 例如,成员函数Push()和Pop()在类定义体外定义为:如图 类模板的使用:将类模板实例化成一个具体的类,它的格式为:类名对象名; 例如: Stack s1,s2; 其中s1,s2就是用类模板Stack创建的模板参数为char型的两个对象。,第12章 模板的程序设计,12.3 类模板,12.3.2 类模板的使用 1.栈类模板的使用 【例12-6】栈类模板的使用示例。 分析:下面是使用上节定义的类模板Stack的完整例子,在此例中建立了字符型和整型两个堆栈。,第12章 模板的程序设计,12.3 类模板,12.3.2 类模板的使用 2.链表类模板的使用 【例

14、12-7】链表类模板的使用示例。 分析:下面一段程序建立了一个简单的单向链表类模板,然后通过建立一个保存字符的链表来演示该类模板。,第12章 模板的程序设计,12.3 类模板,12.3.2 类模板的使用 3.两个类型参数的类模板的使用 模板类可以有多个类型参数。 【例12-8】建立两个类型参数的类模板示例。 分析:这个程序定义了一个具有两个类型参数的类模板,在main ()函数中定义了两种类型的对象,ob1使用了int型与double型数据,ob2使用了char型和char*型数据。,第12章 模板的程序设计,12.4 上机实训,12.4.1 实训一:函数模板 1.实训目的 掌握函数模板的定义与使用方法。 2.实训要求 (1)设计一个有一种类型参数的函数模板。 (2)设计一个有两种类型参数的函数模板。 3.实训内容: P294,第12章 模板的程序设计,12.4 上机实训,12.4.2 实训二:类模板 1.实训目的 掌握类模板的定义与使用方法。 2.实训要求 (1)设计一个有一种类型参数的类模板。 (2)设计一个有两种类型参数的类模板。 3.实训内容: P295,第12章 模板的程序设计,本章结束!,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号