第13章泛型机制模板ppt课件.ppt

上传人:本田雅阁 文档编号:3125287 上传时间:2019-07-13 格式:PPT 页数:43 大小:334.52KB
返回 下载 相关 举报
第13章泛型机制模板ppt课件.ppt_第1页
第1页 / 共43页
第13章泛型机制模板ppt课件.ppt_第2页
第2页 / 共43页
第13章泛型机制模板ppt课件.ppt_第3页
第3页 / 共43页
第13章泛型机制模板ppt课件.ppt_第4页
第4页 / 共43页
第13章泛型机制模板ppt课件.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第13章泛型机制模板ppt课件.ppt》由会员分享,可在线阅读,更多相关《第13章泛型机制模板ppt课件.ppt(43页珍藏版)》请在三一文库上搜索。

1、第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值 类模板的友元 类模板作为基类,类模板的定义,类模板允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数或返回值能取任意数据类型。 定义格式: template class 标识符 class 类名/;,类模板实例,定义一个泛型的、可指定下标范围的、安全的数组,类模板定义,template class Array int low; int high; T *storage; public: Array(int lh = 0, int rh = 0): low(lh), high(rh) s

2、torage = new T high - low + 1; Array(const Array ,类模板的成员函数的定义,类模板的成员函数都是函数模板,模板参数与类模板相同 形式: Template 返回类型 类模板名:成员函数名(函数的形参表) 函数体 Array类的成员函数的格式 template 返回类型 Array:函数名(形式参数表) 函数体,Array的成员函数的实现,template Array ,template Array:Array(const Array ,第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值 类模板的友元 类模板作

3、为基类,类模板的实例化,编译器从模板生成一个特定的类或函数的过程称为模板的实例化。 类模板实例化后形成一个模板类。 类模板的实例化格式如下: 类模板名 对象名; 如: Array array1(20,30); Array array2(10, 20);,模板类的对象的使用,我们可以用下列语句输入array2的值: for (i=10; i=20; +i) array2i = 0.1 * i; 也可以用下列语句输出array1的值: for (i=20; i=30; +i) cout array1i t;,第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值

4、 类模板的友元 类模板作为基类,模板的编译,编译模板时,编译器进行三个阶段的检查 第一阶段是编译模板定义本身。这个阶段编译器只是检查一些诸如漏掉分号、变量名拼写错误之类的语法错误。 第二阶段是编译器看到模板使用时。对于函数模板,检查实际参数的数目和类型是否恰当。对于类模板可以检测出提供的模板的实际参数的数目是否正确。 第三阶段是实例化。编译器彻底编译模板。 所以,调试包含类模板的程序时,必须在定义了类模板的对象并且对对象调用了所有的成员函数后,才能说明类模板的语法是正确的。,第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值 类模板的友元 类模板作为基类

5、,非类型形参,模板的形式参数不一定都是类型,也可以是非类型的参数。 在模板实例化时,类型参数用一个系统内置类型的名字或一个用户已定义类的名字作为实际参数,而非类型参数将用一个值作为实际参数。非类型的模板实参的值必须是编译时的常量。,非类型形参实例,定义了一个安全的、可指定下标范围的、且下标范围必须是编译时的常量的类模板Array。(相当于C+中的普通数组),设计考虑,在定义类模板时,数组的大小是不知道的,但在编译时必须给出。 这可以通过非类型参数实现:该类模板有三个模板参数:数组元素的类型、数组下标的上下界。前者为类型参数,后者为非类型参数。,类定义,template class Array

6、T storagehigh - low + 1; public: T ,类模板的使用,定义一个下标范围为10到20的整型数组,可用下列语句: Array array;,参数的默认值,模板参数和普通的函数参数一样,也可以指定默认值。如果前例中的类模板Array经常被实例化为整型数组,则可在类模板定义时指定缺省值: template class Array ; 当要定义整型数组array时,就可以不指定模板的实参: Array array;,第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值 类模板的友元 类模板作为基类,类模板的友元,类模板可以声明两种友元

7、: 声明普通的类或全局函数为所定义的类模板的友元 声明某个类模板或函数模板的实例是所定义类模板的友元,普通友元,定义普通类或全局函数为所定义类模板的友元的声明格式如下所示: template class A friend class B; friend void f(); ; 该定义声明了类B和全局函数f是类模板A的友元。B的所有的成员函数和全局函数f可以访问类模板A的所有实例的私有成员。,特定实例的友元,定义一: template friend class B; /类模板声明 template friend void f(const T 将类模板B的一个实例,即模板参数为int时的那个实例作

8、为类模板A的所有实例的友元。将函数模板f对应于模板参数为int的实例作为类模板A所有实例的友元。,特定实例的友元,定义二 template friend class B; template friend void f(const T 这些友元定义说明了类模板A的特定实例与使用同一模板实参的类模板B和函数模板f的实例是友元。,类模板的友元实例,为类模板Array增加一个输出运算符重载函数,可以直接输出数组的所有元素。如有定义 Array array(10,20); 如程序中为该数组元素赋的值是10到20。即,将10赋给array10,11赋给array11,。可以直接用cout array;输出

9、这11个元素的值。,实现考虑,要直接输出数组的所有元素,可以为类模板Array重载“”运算符。 由于Array是一个类模板,可用于不同类型的数组,因此,该输出运算符重载函数也应该是函数模板。 当array和operator取相同实参时,array的实例将operator的实例作为友元,重载函数模板的实现,template ostream ,增加了输出重载的类模板Array,template class Array; /类模板Array的声明 template ostream public: 。 ,类模板的友元实例,定义一个单链表,可以存放任意类型的数据。将单链表的所有操作都封装在单链表类中,使

10、得单链表的用户只需要知道单链表可以做那些操作,而不用去管这些操作是如何实现的。,实现考虑,单链表中的每个元素存放在一个单独的节点中 存储一个单链表就是存储一个指向单链表头节点的指针。 单链表的实现必须有两个类: 节点类 单链表类 由于我们要求的单链表是可以处理任何类型,因此这两个类都是模板。,类模板node的定义,template class linkList; template ostream ,linkList的定义,template class linkList friend ostream ,类模板linkList成员函数的实现,template void linkList:makeE

11、mpty() node *p = head-next, *q; head-next=NULL; while (p != NULL) q=p-next; delete p; p=q; ,template void linkList:create(const elemType ,linkList类模板中的输出运算符重载函数的实现,template ostream ,链表类的使用,定义: linkList intList; 该定义产生了类模板的一个整型实例 如果想创建这个单链表,可以调用create函数: intList.create(0); 该调用将输入链表中的元素值,直到输入0为止。 要输出链表

12、的所有元素,可以直接输出: cout intList;,链表类的另一种实现,由于结点类只有链表类要用,因此可以将结点类作为链表类的内嵌类。 这样既可以保证结点类对于链表类的私有性,访问也更加方便。,第13章 泛型机制模板,类模板的定义 类模板的实例化 模板的编译 非类型形参和参数的默认值 类模板的友元 类模板作为基类,类模板作为基类,类模板可以作为继承关系中的基类。自然,从该基类派生出来的派生类还是一个类模板,而且是一个功能更强的类模板。 类模板的继承和普通的继承方法基本类似。只是在涉及到基类时,都必须带上模板参数。,类模板继承实例,从linkList类模板派生一个栈的类模板 栈是一类特殊的线

13、性表,它的插入和删除都只能在表的一段进行。允许插入和删除的一端称为栈顶,另一端称为栈底。栈的常用操作有进栈(push)和出栈(pop)。 由于栈是一个特殊的线性表,因此可以将栈建立在表的基础上。在单链表中,我们可以将表头定义为栈顶,表尾定义为栈底。因此,栈就是在单链表的基础上增加两个操作:push和pop。,栈的类模板的定义,template class stack : public linkList public: void push(const elemType ,类模板stack的使用,定义一个整型栈:stack st; 进栈: for (int i = 1; i 10; +i) st.push(i); 出栈: while (st.pop(i) cout i t; 执行结果: 9 8 7 6 5 4 3 2 1,小结,本章介绍了C+中的泛型程序设计的工具-模板。 模板是独立于类型的蓝图,编译器可以根据模板产生多种特定类型的实例。 模板分为函数模板和类模板。 本章中,我们学习了如何写一个类模板,如何实例化类模板,使之成为一个模板类,如何定义及使用模板的友元。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1