![C程序设计教程14_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-3/18/99514a22-be11-40a8-ac9a-8bb7220491e1/99514a22-be11-40a8-ac9a-8bb7220491e11.gif)
![C程序设计教程14_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-3/18/99514a22-be11-40a8-ac9a-8bb7220491e1/99514a22-be11-40a8-ac9a-8bb7220491e12.gif)
![C程序设计教程14_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-3/18/99514a22-be11-40a8-ac9a-8bb7220491e1/99514a22-be11-40a8-ac9a-8bb7220491e13.gif)
![C程序设计教程14_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-3/18/99514a22-be11-40a8-ac9a-8bb7220491e1/99514a22-be11-40a8-ac9a-8bb7220491e14.gif)
![C程序设计教程14_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-3/18/99514a22-be11-40a8-ac9a-8bb7220491e1/99514a22-be11-40a8-ac9a-8bb7220491e15.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、11:43:011C+程序设计教程(第二版)第十四章 模板 Chapter 14 Template 11:43:012n思考角度 C+程序是一些类型和函数,编程就是设计类型和函数,然后按C+的程序结构来组织n模板编程 世界上万事万物都具有相似性,许多类型和函数尽管处理的数据不同,但其行为也具有相似性,将相似的类型归为类型族以及相似的函数归为函数族的编程,就是模板编程n编程方法的侧重点 面向对象编程解决类体系中的不同对象行为表现 模板编程解决独立类之间的不同对象行为表现 多个独立类可以是多个类继承体系,因而,面向对象编程与模板编程是融合的 11:43:013第十四章内容 函数模板函数模板(Fun
2、ction Template) 函数模板参数函数模板参数(Function Template Parameter) 类模板类模板(Class Template) 实例化与定做实例化与定做(Instantiation & Specialization) 程序组织程序组织(Program Organization) 模板的多态模板的多态(Template Polymorphism) 高级编程高级编程(Advanced Programming) 11:43:0241. 函数模板函数模板 ( Function Template ) 理想的函数重载是针对不同的参数做不同的事而形如:void s
3、a, Type& b) Type t=a; a=b; b=t;的重载函数系所定义的行为序列却相同这种形式的重载意义不大11:43:025templatevoid s a, T& b) T t=a; a=b; b=t;定义函数模板来表示重载函数系:模板形参函数模板名数据形参函数模板定义体11:43:026templatevoid s a, T& b) T t=a; a=b; b=t;int fn() int ix=6, iy=7, ia=3, ib=5; s, iy); /产生函数定义体 s, ib);/不产生函数定义体 /.函数模板用法:以函数模板名作调用的函数名,以数
4、据实参作参数传递11:43:0272. 函数模板参数函数模板参数 ( Function Template Parameter ) 数据参数是按值的性质匹配的,所以相容类型之间可以转换类型参数是按名字匹配的,更为苛刻templatevoid s a, T& b) T t=a; a=b; b=t;int add(double a, double b) return a+b;int fn() int ia=3; double db=5.0; char s1=good, s2=better; int x = add(ia, db); / ok s, db); / error s, s2); /
5、 error11:43:028数据形参分:引用型参数(提倡用本项)非引用型参数引用型参数分:引用型参数常量引用型参数11:43:029常量引用型形参其数据形参可以是临时对象,所以,通过显式转换可以规定模板的产生形式但是,不能被隐式转换的数据形参,其显式模板类型指定失效:templateT const& max(T const& a, T const& b) return a b ? b : a;int main() int ia=3; double db=6.7; db = max(ia, db); db = max(static_cast(ia), db); db =
6、 max(&ia, db); /error11:43:0210引用型形参其数据形参与数据实参捆绑,故数据实参应为左值表达式:templatevoid s a, T& b) T t=a; a=b; b=t;int main() int ia=3; const int cb=5; s, 7); / error:7不是左值不是左值 s(ia, 7); / error:哪怕类型指定也不济哪怕类型指定也不济 s, 7); / error:const int会引起操作错误会引起操作错误 s int(ia, 7); / error:同上同上11:43:0211函数模板重载参数有不同的形式(是
7、否引用,是否常量,甚至是否特殊类型),不同形式的参数,其行为不同,这是模板重载的前提例如:字串比较很特殊,指针比较与对象比较亦不同,则:templateT const& max(T const& a, T const& b) return a b ? b : a;templateT* const& max(T* const& a, T* const& b) return *a *b ? b : a;const char* const& max(const char* const& a, const char* const&
8、 b) return strcmp(a,b) 0 ? b : a;int main() int ia=3, ib=7; char *s1=”hello”, *s2=”hell”; cout*max(&ia, &ib)”n”; / match the second template coutmax(s1, s2)”n”; / match the max function coutmax(ia, ib)”n”; / match the first template11:43:02123. 类模板类模板 ( Class Template ) 有些类,比如容器类,处理一种类型的对象与处
9、理另一种类型的对象方法一样,但是就因为处理的对象类型不同,而使该类必须重新定义例如:CatList, DogList, RabbitList等11:43:0213通过模板类定义,可以解决代码冗繁问题:templateclass Nodepublic: Node(const T& d):c(d),next(0),pref(0) T c; Node *next, *pref;11:43:0214又例如下面的模板类定义,含有模板类的成员:templateclass List Node *first, *last;public: List(); void add(const T& c)
10、; void remove(const T& c); Node* find(const T& c)const; void print()const; List();11:43:0215与类定义相似,成员函数的定义一般放在类定义的外部,与类定义分开以有利于程序的组织放在模板类定义外部的成员函数的定义形式为:templateList:List():first(0),last(0)templatevoid List:add(const T& n) Node* p = new Node(n); p-next = first; first = p; (last ? p-next-
11、pref : last) = p;List构造函数11:43:0216类模板(class template):侧重于模板的描述(声明或定义),例如:Templateclass List;/类模板声明template /类模板定义class List Node *first, *last;public: List(); void add(const T& c); void remove(const T& c); Node* find(const T& c)const; void print()const; List();模板类(template class):侧重于模板的
12、使用形式例如:List /T为类型形参List /Dog是类型实参形如List形式的类,不管是形参还是实参,本书都称之为为模板类11:43:0217高级模板概念中,类模板声明,如:Templateclass List等同于带有形式类型参数的模板类,如:List并将其作为一种类型看待所以本质上不区分类模板与模板类11:43:0218模板类的使用将直接透入对象的构造,因此,允许模板类带有值参便理所当然了templateclass bitset;但是类型值参将导致不同的类模板描述,因而决定了不同的值参值,生成不同的模板类bitset a;bitset b;a = b; / error值参值应为编译能
13、识别的常量,值参多为整型.11:43:02194. 实例化与定做实例化与定做 ( Instantiation & Specialization ) 实例化遵循一次定义原则第一次用特定的类型实参使用模板类时,将引起类模板的实例化(产生类定义)List dList;/产生实例化List eList;/不再实例化第一次用特定的类型实参使用模板函数时,将引起函数模板的实例化(产生函数定义)11:43:0220实例化与实施的操作有关,构造对象所触发的实例化,只实例化其构造函数,不实例化类模板的其他成员函数但可以通过显式请求,强制整体实例化template List;/实例化整个模板类List d
14、List;/实例化构造函数dList.add(3.6);/实例化add成员dList.add(5.8);/不再实例化,只是简单调用List iList;/不再实例化iList.add(5);/不再实例化11:43:0221对于特定的类型实参,希望其行为不同于类模板所规定的操作,可以根据该实参来定做,定做的模板称为模板铸件(或称特制模板),如:templateclass List Node *first, *last;public: List(); void add(const Cat& c); void remove(const Cat& c); Node* find(cons
15、t Cat& c)const; void print()const; List();11:43:0222模板铸件可为类,亦可为模板若为模板,则其定做称为局部定做 templateclass A . ;局部定做1templateclass A ; /A为模板局部定做2templateclass A ; /A为模板使用时要注意:A dCat; /按A匹配A dd;/按A匹配A cCat; /错:A还是A?11:43:02235. 程序组织程序组织 ( Program Organization ) 包含方式模板使用的方式,不但创建了模板函数定义或模板类定义,还实施了函数调用,或者创建了对象,
16、实施了对象操作.因此,除了需要函数模板声明或类模板定义之外,还需要函数模板定义和类模板的实现.也就是说,任何使用模板之前,编译应该能够事先看到整个模板的说明.这就是包含方式的由来.11:43:0224模板使用/x.cpp#include”tlist.h”int main() List dList; dList.add(3.6); dList.print(); List iList; iList.add(5); iList.add(8); iList.print();模板说明/ tlist.h#ifndef TLIST#define TLISTtemplatestruct Node . ;tem
17、plate /类模板定义class List . ;template /类模板成员函数实现List:List():first(0),last(0)templatevoid List:add(const T& n) . / .#endif / TLIST11:43:0225分离方式通过关键字export来规定编译和链接模板的方式,分离模板定义和模板实现,让使用模板者无须与模板实现见面11:43:0226模板实现/ tlist.cpp#include”tlist.h”export templateList:List():first(0),last(0)export templatevoid
18、 List:add(const T& n) . / .模板定义/ tlist.h#ifndef TLIST#define TLISTtemplatestruct Node . ;export template /类模板定义class List . ;#endif / TLIST模板使用(与包含方式同)/x.cpp#include”tlist.h”int main() List dList; dList.add(3.6); dList.print(); List iList; iList.add(5); iList.add(8); iList.print();11:43:02276. 模
19、板的多态模板的多态 ( Template Polymorphism ) 不同类型的对象,作相同名字的操作,却表现为不同的行为,便是多态虚函数所表现的多态是基于类继承体系的,而模板的多态却适合于任何孤立的类由对象捆绑同名操作,以求识别不同的行为,得等到运行过程中获得传递的对象之后动多态由实例化模板类,进而创建对象,来规定对象的操作,便可以在对象创建中,确定对象未来将要进行捆绑的同名操作的行为静多态11:43:0228静多态class Dog;class Cat;templateclass List;templatevoid fn(list& a) a.print(); /其行为取决于a的类型 int main() List dlist; dlist.add(); List clist; clist.add(); fn(dlist);/定义void fn(list) fn(clist);/定义fn的重载函数11:43:02297. 高级编程高级编程 ( Advanced Programming ) 静多态无须动态联编,而同样可以实现多态/ application1.cpp#include”interfacetv.h”Templatevoid operating(TV& tv) tv.adjus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度跨境电商培训合资服务合同
- 2025年度古建筑遗址考古发掘与文物保护合同范本
- 1经开区基础设施改造提升项目一期(2025年度)绿化养护合同
- 2025年度货运代理仓储管理合作协议
- 2025年度教育机构学生贷款合同印花税明确条款
- 2025年度光伏电站设备租赁与维修服务合同模板
- 2025年度绿色能源项目借款第三方担保合同
- 2025年度国际贸易物流跟踪与配送服务合同
- 2025年化工厂安全生产培训与考核合同
- 2025年度合伙人股权继承与传承协议范本
- 护理指南手术器械台摆放
- 肿瘤患者管理
- 四川省成都市高新区2024年七年级上学期语文期末试卷【含答案】
- 2025年中国航空部附件维修行业市场竞争格局、行业政策及需求规模预测报告
- 旅游行业智慧旅游营销策略与方案
- 《应收培训》课件
- 国土空间生态修复规划
- 2024统编版初中八年级语文上册第五单元:大单元整体教学设计
- 小记者新闻写作培训
- IPO项目尽职调查清单(详细)
- ETL开发工程师招聘面试题及回答建议2025年
评论
0/150
提交评论