07 模板.ppt_第1页
07 模板.ppt_第2页
07 模板.ppt_第3页
07 模板.ppt_第4页
07 模板.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章 模板,课件制作,2,主要内容,模板的概念(15.1,15.2) 函数模板(15.2) 类模板(15.4),课件制作,3,7.1 模板的概念,模板的引入,class Compare_int public: Compare_in(int a,int b) x=a;y=b; int max( ) return(xy)?x:y; int min( ) return(xy)?x:y; private: int x,y; ;,class Compare_float public: Compare_float(float a,float b) x=a;y=b; float max( ) return

2、(xy)?x:y; float min( ) return(xy)?x:y; private: float x,y; ,这两个类的功能是对两个整数(浮点数)作比较,可以通过调用成员函数max和min得到两个整数中的大者和小者。 两个或多个类,其功能是相同的,仅仅是数据类型不同,能否有办法减少重复性的工作?,请思考这两个类的功能和特点?,课件制作,4,7.1 模板的概念,C+在发展的后期增加了模板(template)的功能,提供了解决这类问题的途径。可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数。如对以上两个类可以综合写出以下的类模板:,template /声明一个模板,虚拟类型名为

3、numtype class Compare /类模板名为Compare public: Compare(numtype a,numtype b) x=a;y=b; numtype max( ) return (xy)?x:y; numtype min( ) return (xy)?x:y; private: numtype x,y; ;,课件制作,5,7.1 模板的概念,请将此类模板和前面第一个Compare_int类作一比较,可以看到有两处不同: (1) 声明类模板时要增加一行:template (2) 原有的类型名 int 换成虚拟类型参数名 numtype 在建立类对象时,如果将实际类型

4、指定为int型,编译系统就会用int取代所有的numtype;如果指定为float型,就用float取代所有的numtype,这样就能实现“一类多用”。 如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。 利用类模板可以建立含各种数据类型的类。 Compare cmp(4,7); 即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化了,或者说实例化了。,课件制作,6,7.1 模板的概念,/CH7_1.cpp template /声明一个模板,虚拟类型名为numtype class Com

5、pare /类模板名为Compare public: Compare(numtype a,numtype b) x=a;y=b; numtype max( ) return (xy)?x:y; numtype min( ) return (xy)?x:y; private: numtype x,y; ;,#include using namespace std; int main() Compare cmp_i(4,7); int imax = cmp_i.max(); cout cmp_f(4.5,4.49); float fmax = cmp_f.max(); cout Max :fmax

6、endl; return 1; ,课件制作,7,7.1 模板的概念,模板概念 它可以实现类型参数化,即把函数或类中的数据类型定义为参数,从而解决参数多态性问题,实现代码可重用性 模板分类(按用途) 函数模板 类模板 参数实例化 指给函数模板或类模板带入实际的类型参数 C+中把经过参数实例化的函数模板称为模板函数,把经过参数实例化的类模板称为模板类,课件制作,8,7.1 模板的概念,模板、模板函数、模板类和对象之间的关系,课件制作,9,7.2 函数模板,函数模板的定义 函数模板的定义以关键字 template 开始,后跟一个参数列表 每个参数前必须有关键字 typename 或 class ,形

7、式为 习惯上用单个大写字母(如 T )来表示类型参数 可以使用或来指定类型参数,建议使用前者 一个模板函数可以有多个类型参数,格式为,template 返回类型 函数名(函数模板形参表) 函数体; , 或,课件制作,10,7.2 函数模板,设计一个求两个数中较大数的函数模板 template T max ( T x, T y) return (xy)? x:y; ,template T max (T x, T y) return (xy)? x:y; ,课件制作,11,7.2 函数模板,模板函数的生成(函数模板的实例化) 基本概念 函数模板在具体调用时必须进行参数实例化 经参数实例化而生成的具

8、体函数称为模板函数 对模板形参进行实例化的参数称为模板实参 生成模板函数的方法 显式方法:在函数模板调用前,用基本数据类型或用户自定义数据类型对函数模板进行参数实例化,生成模板函数,int myIntX=5, myIntY=8, myIntC; float myFloatX=5.6, myFloatY=8.9, myFloatC; int max(int x, int y); myIntC=max(myIntX, myIntY); float max(float x, float y); myFloatC=max(myFloatX, myFloatY);,函数模板实例化,模板函数调用,课件制作

9、,12,7.2 函数模板,模板函数的生成(函数模板的实例化) 生成模板函数的方法 隐式方法:直接传递实参进行函数调用,在函数模板调用时,由编译系统根据调用函数的实际参数的数据类型自动进行参数实例化,生成模板函数,int a=10, b=20, c; c = max(a, b);,课件制作,13,7.2 函数模板,函数模板与同名的非模板函数的调用规则 对一个实际的函数调用,首先寻找一个参数完全匹配的函数,若找到就调用它 在(1) 失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到就调用它 在(1) 和 (2) 均失败后,再试低一级的对函数的重载方法,例如通过类型转换可产生参数匹

10、配等,若找到就调用它 若(1), (2), (3) 均失败,则这是一个错误的调用,课件制作,14,7.2 函数模板,/CH7_2.cpp #include using namespace std; template /A 函数模板 T max(T x, T y) couty)? x:y; ,int max(int x, int y) /B 函数 couty)? x:y; ,char max(int x, char y) /C 函数重载 couty)? x:y; ,int main( ) int i = 10; char c = a; float f = 43.74f; max(i, i); m

11、ax(c, c); max(i, c); max(c, i); max(f, f); max(f, i); return 1; ,int main( ) int i = 10; char c = a; float f = 43.74f; max(i, i); /B max(c, c); /A max(i, c); /C max(c, i); /C max(f, f); /A max(f, i); /C return 1; ,课件制作,15,7.3 类模板,类模板的概念 一个类模板(类属类)是一个带参数的类 类模板允许用户为类定义一种模式,使得类中的某些成员变量、某些成员函数的参数或返回值,能取

12、任意数据类型(包括系统预定义的和用户自定义的类型) 类模板的设计,template class 类名 / ;,template是一个声明模板的关键字,模板形参表可包括一个或一个以上的模板参数。 每个模板参数前加关键字typename 或 class, 如:typename T1 ,typename T2 ,,课件制作,16,7.3 类模板,类模板的设计 在类定义中参数化的数据类型用模板形参表示,template class Complex T real; T imag; public: Complex(T x=0, T y=0); Complex Add(const Complex x); ;

13、,课件制作,17,7.3 类模板,类模板的设计 在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需在函数体外进行模板声明,并在函数名前的类名后缀上,template /模板声明 Complex:Complex(T x, T y) real = x; imag = y; template /模板声明 Complex :Add(const Complex x) return Complex(real+x.real, imag+x.imag); ,注意:类模板定义前和每个外联函数形式的成员函数模板前,都要加语句: template ; 原来程序中为 Complex 的地方,均应改为:Co

14、mplex,课件制作,18,7.3 类模板,/TComplex.h #include using namespace std; template class Complex private: T real; T imag; public: Complex(T x=0, T y=0); Complex operator+(const Complex c); void Display()cout /模板声明 Complex:Complex(T x, T y) real = x; imag = y; template /模板声明 Complex Complex :operator+(const Co

15、mplex c) return Complex(real + c.real, imag + c.imag); ,int main( ) Complex c1(3,5),c2(4,6),c3; c3 = c1 + c2; c3.Display(); return 1; ,课件制作,19,7.3 类模板,对于模板类,将声明和实现放在头文件中(.h)更安全,很多编译器不支持将二者分离 C+允许为模板类中的类型参数指定一个默认类型,/TComplex.h #include using namespace std; template class Complex private: T real; T im

16、ag; public: Complex(T x=0, T y=0); Complex operator+(const Complex c); void Display()cout(real,imagi)endl; / ;,默认类型只能用于模板类,不能用于模板函数,课件制作,20,7.3 类模板,类模板可有多个模板参数,template class MyClass private: T1 i; T2 j; public: MyClass(T1 a, T2 b)i=a; j=b; / ; MyClass ob1(12, 0.15); MyClass ob2(x, “This is a test”)

17、;,课件制作,21,7.3 类模板,在模板前缀中,除了类型参数外,还可以使用非类型参数,/StackT.h #include using namespace std; template class Stack private: T elementscapacity; int size; ;,非类型参数,Stack myStack;,课件制作,22,7.3 类模板,类模板的使用 模板形参实例化:在外部程序中,用显式方法给类模板传递实例化参数,生成模板类 类实例化:使用模板类定义对象,使用复数类模板生成int复数类并创建对象:Complex a(2,4), b(1,5), c; c = a + b

18、; 使用复数类模板生成float复数类并创建对象:Complex a(2.1,4.3), b(1.2,5.3), c; c = a + b;,课件制作,23,7.3 类模板,和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象 模板可以有层次,一个类模板可以作为基类,派生出派生模板类 在模板类中可以定义静态成员,每个模板实例化后都拥有独有的静态数据域拷贝 友元的使用,对于模板类和非模板类都是一样的 一个非模板类可以派生自一个模板类的特例化 一个模板类可派生自一个非模板类,课件制作,24,7.3 类模板,使用类模板需要注意的问题 进行类模板声明时,语句template 的

19、“”,不要写成普通函数声明中用的“( )” 在一个类模板定义中用到另一个类模板时,只写类模板的模板名,却忘记写上模板参数 每一个类模板参数必须在类模板体内至少使用一次 在全局域中声明与类模板参数同名的对象、函数或类型,在类模板体内被隐藏 类模板定义中声明的对象或类型不能与类模板参数同名 模板类型参数名可以用来指定类模板成员函数的返回类型 一个类模板的定义和该类模板的多处声明所使用的模板参数名可以相同,课件制作,25,7.3 类模板,例 CH7_3:定义一个栈类模板,实现栈的基本功能,如入栈、出栈、判断栈空(满)等。 栈中存放数据的类型由实例化时的模板类型参数决定。 在测试程序中实例化三种类型的

20、栈,并打印栈中的数据,课件制作,26,7.3 类模板,/TStack.h #include using namespace std; template class TStack /模板类TStack,实现栈的基本功能,存放的数据类型由模板参数T决定 public: TStack(int s= 20); TStack (); int Push(const T,课件制作,27,7.3 类模板,/TStack.h / /类模板的实现 /构造一个容量为(0,500的栈 template TStack:TStack(int s) if(s 500) size = 20; else size = s; t

21、op = 0; pStack = new Tsize*sizeof(T); template TStack:TStack() delete pStack; ,/ 判栈满 template bool TStack:IsFull() if(top=size) return true; else return false; / 判栈空 template bool TStack:IsEmpty() if(top=0) return true; else return false; ,课件制作,28,7.3 类模板,/ 入栈 template int TStack:Push(const T ,/ 从栈底

22、到栈顶输入栈中元素 template void TStack:Print() cout Stack(; for(int i=0; itop; i+) cout pStacki; if (itop-1) cout , ; cout )n; ,课件制作,29,7.3 类模板,/TStackTest.cpp 测试程序 #include using namespace std; #include TStack.h int main() /实例化TStack的3个对象,每个对象做5次入栈操作, /每次操作后都打印出栈中所有元素 TStack s1;/实例化一个存放int类型数据的栈对象 cout s2;

23、 coutendl栈s2信息如下:endl; for(i=0; i5; i+) s2.Push(i*1.1); /元素i*1.0入栈 s2.Print(); / 打印栈中所有元素 ,课件制作,30,7.3 类模板,char array510 = one, two, three, four, five; /实例化一个存放char*类型数据的栈对象 TStack s3; coutendl栈s3信息如下:endl; for(i=0; i5; i+) s3.Push(arrayi);/元素arrayi0入栈 s3.Print(); / 打印栈中所有元素 return 1; ,注意:模板声明和定义必须全部放在头文件内,否则VC编译器连接时出现错误!,课件制作,31,7.3 类模板,例CH7_4: 定义一个单向链表的类模板,分别实现节点的增加、删除、查找以及链表的打印操作,pHead,pHead,pDel,pPrev,课件制作,32,7.3 类模板,/ TList.h #include using namespace std; / 模板声明 template class TList public: TList(); TList(); void Add(T,/ /模板定义 template TList:TL

温馨提示

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

评论

0/150

提交评论