第六章模板(template)--- 参数化多态性_第1页
第六章模板(template)--- 参数化多态性_第2页
第六章模板(template)--- 参数化多态性_第3页
第六章模板(template)--- 参数化多态性_第4页
第六章模板(template)--- 参数化多态性_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

第六章模板(template)- 参数化多态性6.1 概念C+语言多态性的另一种表现形式是模板。它也称为参数化多态性(Parameterization polymorphism) 。模板机制的设计和细节是由 Bjarne Stroustrup 在其 1988 年 10 月发表的名为“Parameterized Types for C+”一文中披露的。第五章中介绍了函数的重载,类是否也能重载?可以!这就是本章将介绍的模板。现在通过以下例子来看模板的概念和用途。例如有两个类:class Aint i;public:A(int a) void set (int b);class Bdouble i;public:B(double a) void set (double b);它们的结构完全相同,其差别只是数据类型 int 与 double 不同。可以将两个类定义合为一个称为“模板(template) ”的数据结构,其中可供用户选择的数据类型用形参 T 表示,如下:class AT i;public:A(T a) void set (T b);在建立对象时用实参 int 或 double 代入形参 T 即可!这种做法称为参数化(parameterization) ,是将数据类型作为参数(称为类型参数)进行传递,用以替代形参 T 的实参可以是预定义数据类型或用户自定义数据类型(主要是类的对象) ,这是参数化多态性。实现参数化多态性的主要工具是模板(template) 。传递参数的过程中, T 称为模板形参(template parameter)或类型形参(type parameter) ,int 和 double 称为模板实参(template argument)或类型实参(type argument) 。由于 C+语言的程序结构包括函数和类,因此,模板也具有两种不同的形式:函数模板和类模板。模板实例化 模板实例化实例化6.2 函数模板6.2.1 函数模板与模板函数其实,早在 C 语言中,就有解决参数化的简单方法。可以使用define 预处理语句解决不同形参类型的问题,例如:使用define T int,则T max ( T x, T y) return (xy) ? x : y; 可用于处理整型变量。而使用define T double,则T max ( T x, T y) return (xy) ? x : y; 可用于处理 double 型变量。但如需同时处理两种以上的变量,就须要定义两种以上类型,不太方便。在 C+中,第五章中所讲函数重载的方法能够处理较为复杂的情况,并且调用方便。但也有一个不便之处:在调用重载函数(overloaded function)之前,必须事先将所有可能用到的重载函数定义都加以确定,不然就无法调用。为克服这个不便之处,可使用函数模板。在某些方面,它比函数重载更方便更灵活。例 1以5.2.1“普通函数的重载” 例 1平方函数的重载中的程序 overld_fun1.cpp 为例。可使用函数模板如下:/ Templ_fun_3.cpp/ Template of getting square#include template /或 template 也可T sq(T a)return a * a;void main()int i=5;long l=5000;/用户可按需要任意调用std:couttemplate T abs(T i)return (i T max(T a, T b)return (a b) ? a: b;void main()int i=1, j=2, k = -1;double d=1.1, e=2.2, f = -0.123;std:cout 函数模板模板函数 sq(5.55)模板函数 sq(i) 模板函数 sq(l)template T sum(T array, int size)T total = NULL;for (int i=0; iT sum(T array1, T array2, int size) /重载的函数模板T total = NULL;for (int i=0; itemplate void max(T a, T b)T x = (a b) ? a: b;std:cout b) ? a: b;std:cout b) ? a: b;std:couty? x: y;double max(double x, double y)return xy? x: y;char* max(char* x, char* y)return strcmp(x, y)0? x: y;前两个重载函数和第三个重载函数的程序逻辑和操作差别很大。这种情况下,函数模板无法处理,以重载函数为宜。但是,如果每种数据类型的程序逻辑和操作相同,则使用函数模板将会更加简洁和方便。(2)两者的调用机理不同:对于重载函数,编译过程中可直接调用它。但无论它们使用与否,全部都存于代码区中,都占用空间。而模板是一种代码产生机制,通过实例化来产生代码。函数模板在编译过程中,须先建立模板函数,再加以调用。因此只当使用一个具体参数类型时才建立一个模板函数,而当使用另一个具体参数类型时再建立另一个模板函数。编程方便,使用灵活,有时效率较高。6.3 类模板6.3.1 类模板与模板类现在看类模板与模板类的关系。例 1具有一个类型参数的类模板/ templ_cls_5.cpp/ class template with one parameter argument#include templateclass AT j;public:A (T a) j = a; void set_show(T a) std:cout obj1(A);obj1.show( );obj1.set_show(Z);A obj2(12.34);obj2.show( );obj2.set_show(56.78);/* Results:AZ12.3456.78*/类模板的使用和函数模板不同:(1)使用函数模板时,只代入实参即可;(2)使用类模板时,除代入用于初始化的实参例如 A 和 12.34 外,同时还须代入类型参数,例如 char 或 double,它们还必须与实参 A 和 12.34 匹配。例 2具用多个模板参数的类模板/ templ_cls_1.cpp/ class template#include templateclass A X a;Y b;public:A ( X j,Y k) a = j; b = k; void show( ) std:cout obj1( C, 123);obj1.show( );A obj2( 56.78, 123);obj2.show( );/* Results:C , 12356.78 , 123*/例 3类模板中使用缺省(default)参数第一例/ templ_cls_2.cpp/ default parameter is used#include template / X is a default parameterclass Apublic:void f(X a)std:cout bb; /equivalent to bb.g(Z);bb.f(A);A cc;cc.g(12.34);cc.f(20);/* Results:ZA12.3420 */例 4类模板中使用缺省参数第二例/ templ_cls_3.cpp/ default parameter is used#include template/ int is a default parameter/ equivalent to fun(int j=3) class Apublic:void f(X a)std:cout obj1; /i.e.Aobj1.g( 10 );obj1.f(A);A obj2;obj2.g(12.34);obj2.f(20);/* Results:10A12.3420 */例 5类模板中也可混合地使用非类型参数/ templ_cls_4.cpp/ non-type parameter is used#include template / n is a non-type parameterclass Apublic:void f(T a)std:cout obja;obja.g( );obja.f(A);A objb;objb.g( );objb.f(1.23);const int FIVE = 5;/ int k = 5;/ A objc;/error: A : invalid template argument nA objc;objc.g( );objc.f(23.45);/* Results:10 A15 1.235 23.45*/以上程序中,除数字数据(例如 5)外,常量数据(例如 FIVE)也可用作模板的实际参数(real parameter) ,但一般不能使用变量。模板实例化 模板实例化 模板实例化实例化 实例化 实例化根据以上图形可以知道:在使用类模板时,首先类模板中参数类型被预定义数据类型或用户自定义数据类型所替代,也即类模板被实例化(instantiated) 为模板类,然后该模板类再一次被实例化为类的对象,最后该类的对象可被调用。类模板有时也称为参数化数据类型。6.3.2 类模板用作函数形参例 1 类模板用作独立函数 display( )的形参。此程序中使用两个文件:头文件和应用文件(或称实施文件,Implementation file)第一个是头文件:/ array.h/ included by templ_par.cpp#if !defined(_ARRAY_H)#define _ARRAY_Htemplate class arrayint size;T *element;public:array(int s);array();Tvoid enter(int index, T;template array:array(int s)size = s;element = new Tsize;template array:array()delete element;template T类模板templateclass A模板类A模板类A模板类Aobja objb objctemplate void array:enter(int index, T#endif /_ARRAY_H第二个是应用文件(源文件):/ templ_par.cpp/ modified version of Zhang Guo Fengs book, p.227#include #include “array.h“templatevoid display(a

温馨提示

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

评论

0/150

提交评论