C++程序设计教程第二版课件C++程序设计教程14章节

上传人:E**** 文档编号:91244572 上传时间:2019-06-26 格式:PPT 页数:31 大小:90.50KB
返回 下载 相关 举报
C++程序设计教程第二版课件C++程序设计教程14章节_第1页
第1页 / 共31页
C++程序设计教程第二版课件C++程序设计教程14章节_第2页
第2页 / 共31页
C++程序设计教程第二版课件C++程序设计教程14章节_第3页
第3页 / 共31页
C++程序设计教程第二版课件C++程序设计教程14章节_第4页
第4页 / 共31页
C++程序设计教程第二版课件C++程序设计教程14章节_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C++程序设计教程第二版课件C++程序设计教程14章节》由会员分享,可在线阅读,更多相关《C++程序设计教程第二版课件C++程序设计教程14章节(31页珍藏版)》请在金锄头文库上搜索。

1、19:55:03,1,C+程序设计教程(第二版),第十四章 模板 Chapter 14 Template,清华大学出版社 钱 能,19:55:03,2,思考角度 C+程序是一些类型和函数,编程就是设计类型和函数,然后按C+的程序结构来组织 模板编程 世界上万事万物都具有相似性,许多类型和函数尽管处理的数据不同,但其行为也具有相似性,将相似的类型归为类型族以及相似的函数归为函数族的编程,就是模板编程 编程方法的侧重点 面向对象编程解决类体系中的不同对象行为表现 模板编程解决独立类之间的不同对象行为表现 多个独立类可以是多个类继承体系,因而,面向对象编程与模板编程是融合的,19:55:03,3,第

2、十四章内容,函数模板(Function Template) 函数模板参数(Function Template Parameter) 类模板(Class Template) 实例化与定做(Instantiation & Specialization) 程序组织(Program Organization) 模板的多态(Template Polymorphism) 高级编程(Advanced Programming),19:55:03,4,1. 函数模板 ( Function Template ),理想的函数重载是针对不同的参数做不同的事 而形如: void swap(Type 的重载函数系所定义的

3、行为序列却相同这种形式的重载意义不大,19:55:03,5,template void swap(T ,定义函数模板来表示重载函数系:,模板形参,函数模板名,数据形参,函数模板定义体,19:55:03,6,template void swap(T /不产生函数定义体 /. ,函数模板用法: 以函数模板名作调用的函数名,以数据实参作参数传递,19:55:03,7,2. 函数模板参数 ( Function Template Parameter ),数据参数是按值的性质匹配的,所以相容类型之间可以转换 类型参数是按名字匹配的,更为苛刻 template void swap(T / error ,19

4、:55:03,8,数据形参分: 引用型参数(提倡用本项) 非引用型参数 引用型参数分: 引用型参数 常量引用型参数,19:55:03,9,常量引用型形参,其数据形参可以是临时对象,所以,通过显式转换可以规定模板的产生形式但是,不能被隐式转换的数据形参,其显式模板类型指定失效: template T const /error ,19:55:03,10,引用型形参,其数据形参与数据实参捆绑,故数据实参应为左值表达式: template void swap(T / error:同上 ,19:55:03,11,函数模板重载,参数有不同的形式(是否引用,是否常量,甚至是否特殊类型),不同形式的参数,其行

5、为不同,这是模板重载的前提 例如:字串比较很特殊,指针比较与对象比较亦不同,则: template T const / match the first template ,19:55:03,12,3. 类模板 ( Class Template ),有些类,比如容器类,处理一种类型的对象与处理另一种类型的对象方法一样,但是就因为处理的对象类型不同,而使该类必须重新定义例如: CatList, DogList, RabbitList等,19:55:03,13,通过模板类定义,可以解决代码冗繁问题: template class Node public: Node(const T,19:55:03,

6、14,又例如下面的模板类定义,含有模板类的成员: template class List Node *first, *last; public: List(); void add(const T,19:55:03,15,与类定义相似,成员函数的定义一般放在类定义的外部,与类定义分开以有利于程序的组织放在模板类定义外部的成员函数的定义形式为:,template List:List():first(0),last(0) template void List:add(const T ,List构造函数,19:55:03,16,类模板(class template):侧重于模板的描述 (声明或定义),

7、例如: Templateclass List;/类模板声明 template /类模板定义 class List Node *first, *last; public: List(); void add(const T,模板类(template class):侧重于模板的使用形式 例如: List /T为类型形参 List /Dog是类型实参 形如List形式的类,不管是形参还是实参,本书都称之为为模板类,19:55:03,17,高级模板概念中,类模板声明,如: Templateclass List 等同于带有形式类型参数的模板类,如:List 并将其作为一种类型看待 所以本质上不区分类模板与

8、模板类,19:55:03,18,模板类的使用将直接透入对象的构造,因此,允许模板类带有值参便理所当然了 template class bitset; 但是类型值参将导致不同的类模板描述,因而决定了不同的值参值,生成不同的模板类 bitset a; bitset b; a = b; / error 值参值应为编译能识别的常量,值参多为整型.,19:55:03,19,4. 实例化与定做 ( Instantiation & Specialization ),实例化遵循一次定义原则 第一次用特定的类型实参使用模板类时,将引起类模板的实例化(产生类定义) List dList;/产生实例化 List e

9、List;/不再实例化 第一次用特定的类型实参使用模板函数时,将引起函数模板的实例化(产生函数定义),19:55:03,20,实例化与实施的操作有关,构造对象所触发的实例化,只实例化其构造函数,不实例化类模板的其他成员函数但可以通过显式请求,强制整体实例化,template List;/实例化整个模板类 List dList;/实例化构造函数 dList.add(3.6);/实例化add成员 dList.add(5.8);/不再实例化,只是简单调用 List iList;/不再实例化 iList.add(5);/不再实例化,19:55:03,21,对于特定的类型实参,希望其行为不同于类模板所规

10、定的操作,可以根据该实参来定做,定做的模板称为模板铸件(或称特制模板),如: template class List Node *first, *last; public: List(); void add(const Cat,19:55:03,22,模板铸件可为类,亦可为模板若为模板,则其定做称为局部定做,template class A . ; 局部定做1 template class A ; /A为模板 局部定做2 template class A ; /A为模板 使用时要注意: A dCat; /按A匹配 A dd;/按A匹配 A cCat; /错:A还是A?,19:55:03,23,

11、5. 程序组织 ( Program Organization ),包含方式 模板使用的方式,不但创建了模板函数定义或模板类定义,还实施了函数调用,或者创建了对象,实施了对象操作.因此,除了需要函数模板声明或类模板定义之外,还需要函数模板定义和类模板的实现.也就是说,任何使用模板之前,编译应该能够事先看到整个模板的说明.这就是包含方式的由来.,19:55:03,24,模板使用 /x.cpp #include”tlist.h” int main() List dList; dList.add(3.6); dList.print(); List iList; iList.add(5); iList.

12、add(8); iList.print(); ,模板说明 / tlist.h #ifndef TLIST #define TLIST template struct Node . ; template /类模板定义 class List . ; template /类模板成员函数实现 List:List():first(0),last(0) template void List:add(const T& n) . / . #endif / TLIST,19:55:03,25,分离方式 通过关键字export来规定编译和链接模板的方式,分离模板定义和模板实现,让使用模板者无须与模板实现见面,19

13、:55:03,26,模板实现 / tlist.cpp #include”tlist.h” export template List:List():first(0),last(0) export template void List:add(const T& n) . / .,模板定义 / tlist.h #ifndef TLIST #define TLIST template struct Node . ; export template /类模板定义 class List . ; #endif / TLIST,模板使用(与包含方式同) /x.cpp #include”tlist.h” int

14、 main() List dList; dList.add(3.6); dList.print(); List iList; iList.add(5); iList.add(8); iList.print(); ,19:55:03,27,6. 模板的多态 ( Template Polymorphism ),不同类型的对象,作相同名字的操作,却表现为不同的行为,便是多态 虚函数所表现的多态是基于类继承体系的,而模板的多态却适合于任何孤立的类 由对象捆绑同名操作,以求识别不同的行为,得等到运行过程中获得传递的对象之后动多态 由实例化模板类,进而创建对象,来规定对象的操作,便可以在对象创建中,确定对

15、象未来将要进行捆绑的同名操作的行为静多态,19:55:03,28,静多态 class Dog; class Cat; template class List; template void fn(list/定义fn的重载函数 ,19:55:03,29,7. 高级编程 ( Advanced Programming ),静多态无须动态联编,而同样可以实现多态 / application1.cpp #include”interfacetv.h” Template void operating(TV ,/ interfacetv.h #ifndef HEADER_INTERFACETV #define

16、HEADER_INTERFACETV template class InterfaceTV TV tv; public: void adjustVolume() tv.adjustVolume(); void switchChannel() tv.switchChannel(); ; #endif / HEADER_INTERFACETV,19:55:03,30,抽象编程代码 / application2.cpp #include”interfacetv.h” #include”sony.h” #include”natinal.h” void f() InterfaceTV ts; ts.operating(); InterfaceTV tn; tn.oper

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

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

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