清华大学C++模板.ppt_第1页
清华大学C++模板.ppt_第2页
清华大学C++模板.ppt_第3页
清华大学C++模板.ppt_第4页
清华大学C++模板.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、C+程序设计函数模板、类模板,2,内容提要,函数模板 类模板,3,模板函数-问题的引出,例1:计算从 a 到 b 的各整数之和: sum(a,b) if (ab) return 0; return a + sum(a+1,b); ,4,模板函数-问题的引出,例2:计算给定范围内的整数的立方和: sum-cubes(a,b) if (ab) return 0; return cube(a) + sum-cubes(a+1,b); ,5,模板函数-问题的引出,这两个过程共享一种公共的基础模式。 所用的过程名字上不一样; 用于从a算出需要加的项的函数,还有用于提供下一个a值的函数。 填充下面模板中的

2、各空位,产生出上面的各个过程: (a,b) if(ab) return 0; return (a) + (a),b); ,6,函数模板,编写一个函数模板,由编译系统根据函数调用的实参类型自动产生模板函数 根据函数调用的参数,匹配最合适的函数(包括普通函数、已经创建的模板函数) 如果匹配不成功,找到函数模板,根据实参的类型,创建一个合适的模板函数 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。,7,定义函数模板,声明方法: template 函数声明 例如: template T sum( T a, T b) if(ab) return 0; ret

3、urn a.current() + sum(a.next(), b) ; ,8,定义函数模板,例如:求绝对值函数的模板,#include template T abs( T x) return x0?-x:x; void main() int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; ,运行结果: 5 5.5,9,类模板,10,1 类模板 问题的提出,为了多快好省地定义出一批相似的类,可以定义类模板,然后由类模板生成不同的类. 考虑一个数组类,需要提供的基本操作 len():查看数组的长度 getElement(int index

4、):获取其中的一个元素 setElement(int index):对其中的一个元素进行赋值 数组是一种常见的数据类型,元素可以是: 整数 学生 字符串 ,11,1 类模板 问题的提出,这些数组类,除了元素的类型不同之外,其他的完全相同; 类模板: 在定义类的时候给它一个/多个参数,这些参数表示不同的数据类型。 在调用类模板时,指定参数,由编译系统根据参数提供的数据类型自动产生相应的模板类,类模板 (定义多个只有元素 类型不同的类的公共模板),模板类1,12,2 类模板的定义,template /类模板的首部,声明类模板的参数 class 类模板名 声明一个、或多个类型参数,实现类所需要的参数

5、,包括数据成员类型、函数成员的参数类型和返回值类型.,13,2 类模板的定义,例如: template class Carray T *ptrElement; int size; public: Carray(int length); Carray(); int len(); void setElement( T arg, int index); T getElement(index); ,14,3 定义类模板的成员函数,如果需要在类模板以外定义其成员函数,则要采用以下的形式: template 类型名 类名 : 函数名(参数表),15,3 定义类模板的成员函数,例如 template / T

6、是模板类Carray的类型参数 Carray:Carray(int length) /构造函数 ptrElement = new Tlength; size = length; template Carray: Carray() /析构函数 Delete ptrElement; ,16,3 定义类模板的成员函数,template int Carray:len() return size; template void Carray: setElement(T arg, int index) *(ptr+index) = arg; return; template T Carray: getEle

7、ment(int index) return *(ptr+index); ,17,4 模板类的概念,模板类:为类模板中各类型参数指定了具体的数据类型后,即得到一个模板类。 编译系统自动用具体的数据类型替换类模板中的类型参数,生成模板类的代码 为类型参数指定的数据类型不同,得到的模板类不同,18,5 使用类模板声明对象,Carray arrayInt(50), *ptrArrayInt; /创建一个元素类型为int的Carray模板类,并声明该模板类的一个对象、以及一个指针 Carray arrayStr(100); /创建一个元素类型为string的Carray模板类,并声明该模板类的一个对象

8、,其中string是C+标准类库中的字符串类 Carray *ptrArrayStudent; /创建一个元素类型为CStudent的Carray模板类,并声明该模板类的一个指针,其中CStudent是程序员自定义的一个类,同一个类模板的两个模板类是不兼容的 ptrArrayInt = /error,19,6 类模板与非类型参数,类模板的参数声明中可以包括非类型参数(non-type parameter,即不需特化的参数) 非类型参数:用来说明类模板中的属性,不是使用class关键字定义的,而是使用C+内置类型定义的形参 类型参数:用class来说明类模板中的数据类型、成员函数的参数类型和返回

9、值类型,20,6 类模板与非类型参数,template class Carray T *ptrElement; int size; T elements elementsNumber; public: int len(); void setElement(T arg, int index); T getElement(index); 通常,类模板参数声明中的非类型参数可以提高程序的执行效率,21,7 类模板与友员函数,把普通函数声明为类模板的友员函数 利用类型参数,把模板函数声明为对应模板类的友员函数 把其他类的成员函数声明为类模板的友员函数 利用类型参数,把其他模板类的成员函数声明为对应模板

10、类的友员函数 把普通类声明为类模板的友员类 利用类型参数,把一个模板类声明为对应模板类的友员类,22,把普通函数声明为类模板的友员函数,template class CTemp friend void func(int); private: T elementssize; public: CTemp(T arg); ; void func(int size) CTemp a(10);/error: size is a variable CTemp b(10);/ok CTemp c(8.9);/ok int i; for(i=0; i50; i+) coutb.elementsi“ ” c.e

11、lementsiendl; return; ,23,利用类型参数,把模板函数声明为对应模板类的友员函数,template class CTemp friend void func(T arg); private: T elementssize; public: CTemp(T arg); ; template void func(T arg) CTemp a(10); int i; for(i=0; i50; i+) couta.elementsi endl; return; func(5);/ok func(5.0);/ok,template void fun(T arg) /fun不是CT

12、emp的友元函数 CTemp b(10); CTemp c(8.9); int i; for(i=0; i fun(5.0); /error: cannot access private member declared in CTemp,25,把其他类的成员函数声明为类模板的友员函数,template class CTemp friend void myClass:func(); private: T elementssize; public: CTemp(T arg); ; void myClass:func() CTemp b(10); CTemp c(8.9); int i; for(i

13、=0; i50; i+) coutb.elementsi“ ” c.elementsiendl; return; ,26,利用类型参数,把其他模板类的成员函数声明为对应模板类的友员函数,template class CTemp friend void myClass:func(); private: T elementssize; public: CTemp(T arg); ; template void myClass :func() CTemp a(10); int i; for(i=0; i obj; obj.func();/ok,template void myClass :func(

14、) CTemp a(10); CTemp b(10); CTemp c(10); int i; for(i=0; i objA; myClass objB; objA.func(); /error: cannot access private member declared in CTemp objB.func(); /error: cannot access private member declared in CTemp,28,把普通类声明为类模板的友员类,template class CTemp friend class myClass; private: T elementssize;

15、 public: CTemp(T arg); ; myClass的每个成员函数都是类模板CTemp的友员函数,29,利用类型参数,把一个类模板声明为另一个类模板的友员,template class CTemp friend myClassA; friend myClassB; private: T1 elementssize; public: CTemp(T arg); ; myClassA是CTemp的友员类 myClassB是CTemp的友员类 myClassA不是CTemp的友员类 myClassA不是CTemp的友员类,30,8 类模板与static成员,每个模板类有自己的static成员 template class CTemp private: T elementssize; static int count; public: CTemp(T arg); void print()coutcountendl;return; ;,31,9类模板与static成员,template CTemp:CTemp(T arg) int i; for(i=0;isize;i+) elementsi=arg; count+; ,32,9类模板与static成员,int CTemp:count=

温馨提示

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

评论

0/150

提交评论