




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六讲 模板,类模板:表示一组类 函数模板:操作不同类型的对象,2019/8/1,2,类模板 举例:通用栈 class stack T *v; T *p; int sz; public: stack( int s ) v=p=new Tsz=s; stack( ) delete v; void push( T a) *p+=a; T pop( ) return *- -p; int size( ) const return p-v; ;,T:栈中存放的类型,非具体类型,typedef int T; #include “stack.h” /使用整型栈类 typedef char T; #include “stack.h” /使用字符栈类,2019/8/1,3,template class 类模板名 /对类模板的定义 ,T的作用域类定义中,类模板带有类型参数,以表示不同的类。使用时传入实际类型,产生相应的类。, stack类模板: template class stack T *v; T *p; int sz; public: stack( int s ) v=p=new Tsz=s; stack( ) delete v; void push( T a) *p+=a; T pop( ) return *-p; int size( ) const return p-v; ;,2019/8/1,4,stack s(10);,/出错,类模板中 含有不可知的类型,不能直接创建对象,类模板的实例化(给类模板的参数指定具体类型),实例化类模板的一般形式: 类模板名 stack /char实例化stack类模板后的类 stack sc(10); stack si(10);,2019/8/1,5,#include #include “stack.h“ void main( ) stack sch(20); stack si(20); sch.push(a); si.push(10); if(sch.pop( ) != a | si.pop( ) !=10) exit(1); / ,2019/8/1,6,类模板的成员函数可在类模板外定义(非内联): template void stack: push( T a ) *p+=a; template stack: stack(int s) v=p=new Tsz=s; ,实例化的类模板和普通类一样使用: void f( stack / ,2019/8/1,7,类模板的派生: 类模板一组类:可从一个类派生;可从另一类模板派生。,1)基类为一普通类 #include class B int i; protected: float f; public: void g( ) cout class A: public B void a( ) f=12.0; i=12; T t; / ;,2019/8/1,8,A bi; Abc; bi.g( ); bc.g( );,2)基类为另一类模板: template class B public: void f( T b) coutbendl; ;,2019/8/1,9,template class A: public B public: void d( T1 a) coutaendl; ;,A aa; aa.f(10); aa.d(a);,2019/8/1,10,函数模板 函数模板定义的一般形式: template 函数返回值类型 函数名 /函数模板的定义 ,举例: template T max( T a, T b) return ab ? a:b; ,2019/8/1,11,函数模板的实例化 (生成具体的函数代码): 不需用户显式实例化,函数调用时编译器处理 int a, b; char c, d; int m1=max(a, b); char m2=max(c, d); int m3=max(a, c);,编译器不提供函数模板参数的类型转换,使用函数模板要保证函数参数与模板参数正好匹配,函数模板一组名字相同的函数,这些函数 以及和其它同名函数是重载关系。,2019/8/1,12,重载函数的参数匹配规则: (1)若一函数参数正好与调用函数参数匹配,使用这个函数;否则 (2)模板生成的某个函数正好与调用函数参数匹配,用模板生成的函数;否则 (3)相应参数转换后再匹配;,如有外部定义函数 int max( int, int); int a, b; char c, d; int m1=max(a, b); char m2=max(c, d); int m3=max(a, c);,先配外部,2019/8/1,13,模板函数之间可以重载(参数不同): #include template T sum( T *array, int size) T total; for(int i=0; isize; i+) total+=arrayi; return total; ,template T sum( T *array1, T *array2, int size) T total; for(int i=0; isize; i+) total+=array1i+array2i; return total; ,2019/8/1,14,void main( ) static int intarr1 =1,2,3,4,5,6,7,8,9,10; static int intarr2 =2,4,6,8,10,12,14,16; static double douarr =1.1,2.2,3.3,4.4,5.5, 6.6,7.7,8.8,9.9,10.0; int itotal=sum(intarr1,10); double dtotal=sum(douarr, 10); int iatotal=sum(intarr1, intarr2,8); / ,2019/8/1,15,模板参数,特殊版本的模板,模板友元 模板参数 类模板:Islist i1; Islist c; Islist cp1;,2019/8/1,16,函数模板: 模板参数必须在函数参数中出现,两种形式: 1. 直接方式:模板参数为类型定义函数参数; template T max( T a, T b);,2. 间接方式:用来生成另外类型,另外的类型定义函数参数; template void sort(Vector t); int i; Vector vi(10); sort(i); sort(vi);,2019/8/1,17,模板参数除了类型名外,还可以有其它成分: template class buffer T vsz; ; buffer buf1; buffer buf2; buffer buf3;,void ff( ) buffer buf1; buffer buf2; buffer buf3; buffer buf4; buf1=buf2; buff1=buf3; buf4=buf2; / ,2019/8/1,18,无类型参数的类模板: template class x / ; x xi1; xb xi2;,二义性,改为xb) xi2;,注意:函数模板不能用具体类型作模板参数,只能用类型参数。,19,特殊版本的模板 举例: template void f( T a ) coutaendl; ; struct A int i; char c; ;,A a2; f(a2);,void f(A a) cout“i:”a.i“c:”a.cendl; ;,A a1; f(a1);,2019/8/1,20,特殊版本的函数模板要满足:,template void f( Vector a ); void f( A a) / ,2019/8/1,21,友元和静态成员 1).普通函数作友元: template class A private: int i; friend void g( ); ; void g( ) A ai; A ac; coutai.iendl; coutac.iendl; ,2019/8/1,22,2).函数模板作友元,但函数模板的参数和类模板的参数无关: template class B private: int i; template friend void h(B ,2019/8/1,23,3).函数模板作友元,且用到了相应类模板的参数: template class A private: int i; friend void f(A,2019/8/1,24,静态成员: template class x static T s; / ;,x aa; xbb; int x:s=12; char * x:s=“df”;,2019/8/1,25,使用函数模板 向量排序 template class Vector T *v; int sz; public: Vector(int s) v=new Ts; sz=s; int size( ) return sz; T ,函数参数间接使用模板类型参数,不适用于没定义运算符的类 也不适用含义不同的(如对char*),特殊版本的函数模板,2019/8/1,26,用于char* 的特殊版本sort 函数: #include void sort( Vector template class SortableVector : public Vectror, public Comparator public: SortableVector(int s): Vector(s) ,仅因为比较函数不同重写整个sort函数,static保证由模板生成的每个类只有一个比较函数,将比较函数单独提出来,这时特殊版本函数只要重新定义此类。,引入新类,Vector,Comparator,SortableVector,2019/8/1,27,对SortableVector操作的新的sort 函数: template void sort (SortableVector 缺陷SortableVector和Vector有冗余,2019/8/1,28,2 用函数参数来传递操作 template void sort (V
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年医院辐射安全与防护培训考核试题(含答案)
- 2025妇产科主治医师考试《妊娠生理》应试题及答案
- 2025年河道修防与防冶工职业技能资格知识考试题与答案
- (2025年)安徽省淮南市中级会计职称经济法预测试题含答案
- 摄影灯光师基础知识培训
- 摄影微单基础知识培训课件
- 土建技术员试题及答案
- 2025海南省出境旅游合同
- 2025原始设备制造商(OEM)采购与销售合同
- 2025汽车销售提成合同
- 2023年全国保密知识竞赛全套复习题库及答案(共460道题)
- (推荐下载)家族性结肠息肉病教学课件
- 《材料成型装备及自动化》课程大纲
- 公文写作高频词库
- 临时用电JSA分析表
- DB33-T1217-2020《屋面工程质量验收检查用表标准》
- 如何提高护士对患者病情掌握的知晓率
- 固定式压力容器年度检查报告
- 塑胶模具术语中英文对照1
- 浅谈南京图书馆新馆空调冷热源方案的选择
- (高清版)建筑楼盖结构振动舒适度技术标准JGJ_T 441-2019
评论
0/150
提交评论