chap9-C++课件-清华大学郑莉.ppt
- 文档编号:2638327
- 上传时间:2022-11-04
- 格式:PPT
- 页数:80
- 大小:355KB
chap9-C++课件-清华大学郑莉.ppt
《chap9-C++课件-清华大学郑莉.ppt》由会员分享,可在线阅读,更多相关《chap9-C++课件-清华大学郑莉.ppt(80页珍藏版)》请在冰豆网上搜索。
第九章第九章群体类群体类和群体数据的组织和群体数据的组织郑莉郑莉董渊董渊张瑞丰张瑞丰编著编著清华大学出版社清华大学出版社C+语言程序设计(第3版)C+语言程序设计清华大学郑莉本章主要内容本章主要内容l模板模板l群体类群体类l群体数据的组织群体数据的组织2C+语言程序设计清华大学郑莉第一部分第一部分模板模板l函数模板函数模板l类模板类模板3C+语言程序设计清华大学郑莉函数模板函数模板l函数模板可以用来创建一个通用功能函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。
步简化重载函数的函数体设计。
l声明方法:
声明方法:
template函数声明函数模板4C+语言程序设计清华大学郑莉求绝对值函数的模板求绝对值函数的模板#includeusingnamespacestd;templateTabs(Tx)returnx0?
-x:
x;intmain()intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;函数模板运行结果:
运行结果:
55.55C+语言程序设计清华大学郑莉求绝对值函数的模板分析求绝对值函数的模板分析l编译器从调用编译器从调用abs()时实参的类型,推时实参的类型,推导出函数模板的类型参数。
例如,对导出函数模板的类型参数。
例如,对于调用表达式于调用表达式abs(n),由于实参,由于实参n为为int型,所以推导出模板中类型参数型,所以推导出模板中类型参数T为为int。
l当类型参数的含义确定后,编译器将当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:
以函数模板为样板,生成一个函数:
intabs(intx)returnx0?
-x:
x;函数模板6C+语言程序设计清华大学郑莉类模板的作用类模板的作用使用类模板使用户可以为类声明一使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本的返回值,能取任意类型(包括基本类型的和用户自定义类型)。
类型的和用户自定义类型)。
类模板7C+语言程序设计清华大学郑莉类模板的声明类模板的声明l类模板:
类模板:
templateclass类名类成员声明l如果需要在类模板以外定义其成员如果需要在类模板以外定义其成员函数,则要采用以下的形式:
函数,则要采用以下的形式:
template类型名类名:
函数名(参数表)类模板8C+语言程序设计清华大学郑莉例例9-2类模板应用举例类模板应用举例#include#includeusingnamespacestd;/结构体结构体StudentstructStudentintid;/学号学号floatgpa;/平均分平均分;类模板9template/类模板:
实现对任意类型数据进行存取类模板:
实现对任意类型数据进行存取classStoreprivate:
Titem;/用于存放任意类型的数据用于存放任意类型的数据inthaveValue;/用于标记用于标记item是否已被存入内容是否已被存入内容public:
Store(void);/默认形式(无形参)的构造函数默认形式(无形参)的构造函数TGetElem(void);/提取数据函数提取数据函数voidPutElem(Tx);/存入数据函数存入数据函数;/默认形式构造函数的实现默认形式构造函数的实现templateStore:
Store(void):
haveValue(0)1010template/提取数据函数的实现提取数据函数的实现TStore:
GetElem(void)/如果试图提取未初始化的数据,则终止程序如果试图提取未初始化的数据,则终止程序if(haveValue=0)coutNoitempresent!
endl;exit
(1);returnitem;/返回返回item中存放的数据中存放的数据template/存入数据函数的实现存入数据函数的实现voidStore:
PutElem(Tx)haveValue+;/将将haveValue置为置为TRUE,表示表示item中已存入数值中已存入数值item=x;/将将x值存入值存入item1111intmain()Studentg=1000,23;StoreS1,S2;StoreS3;StoreD;S1.PutElem(3);S2.PutElem(-7);coutS1.GetElem()S2.GetElem()endl;S3.PutElem(g);coutThestudentidisS3.GetElem().idendl;coutRetrievingobjectD;coutD.GetElem()endl;/输出对象输出对象D的数据成员的数据成员/由于由于D未经初始化未经初始化,在执行函数在执行函数D.GetElement()时出错时出错1212C+语言程序设计清华大学郑莉第二部分第二部分群群体数据体数据l线性群体线性群体线性群体的概念直接访问群体-数组类顺序访问群体-链表类栈类队列类13C+语言程序设计清华大学郑莉群体的概念群体的概念群体群体是指由多个数据元素组成的集是指由多个数据元素组成的集合体。
群体可以分为两个大类:
合体。
群体可以分为两个大类:
线性群线性群体体和和非线性群体非线性群体。
线性群体中的元素按位置排列有序,线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。
可以区分为第一个元素、第二个元素等。
非线性群体不用位置顺序来标识元非线性群体不用位置顺序来标识元素。
素。
14C+语言程序设计清华大学郑莉线性群体的概念线性群体的概念线性群体中的元素次序与其位置关线性群体中的元素次序与其位置关系是对应的。
在线性群体中,又可按照系是对应的。
在线性群体中,又可按照访问元素的不同方法分为访问元素的不同方法分为直接访问直接访问、顺顺序访问序访问和和索引访问索引访问。
在本章我们只介绍直接访问和顺序在本章我们只介绍直接访问和顺序访问。
访问。
第一个元素第二个元素第三个元素最后一个元素15C+语言程序设计清华大学郑莉数组数组l静态数组是具有固定元素个数的群体,其静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。
中的元素可以通过下标直接访问。
缺点:
大小在编译时就已经确定,在运行时无法修改。
l动态数组由一系列位置连续的,任意数量动态数组由一系列位置连续的,任意数量相同类型的元素组成。
相同类型的元素组成。
优点:
其元素个数可在程序运行时改变。
l动态数组类模板:
例动态数组类模板:
例9-3(9_3.h)直接访问的线性群体16#ifndefARRAY_CLASS#defineARRAY_CLASSusingnamespacestd;#include#include#ifndefNULLconstintNULL=0;#endif/NULLenumErrorTypeinvalidArraySize,memoryAllocationError,indexOutOfRange;char*errorMsg=Invalidarraysize,Memoryallocationerror,Invalidindex:
;动态数组类模板程序1717templateclassArrayprivate:
T*alist;intsize;voidError(ErrorTypeerror,intbadIndex=0)const;public:
Array(intsz=50);Array(constArray&A);Array(void);Array&operator=(constArray&rhs);T&operator(inti);operatorT*(void)const;intListSize(void)const;voidResize(intsz);1818C+语言程序设计清华大学郑莉数组类模板的构造函数数组类模板的构造函数/构造函数构造函数templateArray:
Array(intsz)if(sz=0)/sz为数组大小(元素个数),若小于为数组大小(元素个数),若小于0,则输出错误信息,则输出错误信息Error(invalidArraySize);size=sz;/将元素个数赋值给变量将元素个数赋值给变量sizealist=newTsize;/动态分配动态分配size个个T类型的元素空间类型的元素空间if(alist=NULL)/如果分配内存不成功,输出错误信息如果分配内存不成功,输出错误信息Error(memoryAllocationError);直接访问的线性群体19C+语言程序设计清华大学郑莉数组类的拷贝构造函数数组类的拷贝构造函数templateArray:
Array(constArray&X)intn=X.size;size=n;alist=newTn;if(alist=NULL)Error(memoryAllocationError);T*srcptr=X.alist;/X.alist是对象是对象X的数组首地址的数组首地址T*destptr=alist;/alist是本对象中的数组首地址是本对象中的数组首地址while(n-)/逐个复制数组元素逐个复制数组元素*destptr+=*srcptr+;直接访问的线性群体20C+语言程序设计清华大学郑莉浅拷贝浅拷贝alistsizeAA的数组元素占用的内存拷贝前alistsizeAA的数组元素占用的内存拷贝后alistsizeBintmain()ArrayA(10);.ArrayB(A);.templateArray:
Array(constArray&X)size=X.size;alist=X.alist;21C+语言程序设计清华大学郑莉深拷贝深拷贝alistsizeAA的数组元素占用的内存拷贝前alistsizeAA的数组元素占用的内存拷贝后alistsizeBB的数组元素占用的内存22C+语言程序设计清华大学郑莉数组类的重载数组类的重载=运算符函数运算符函数templateArray&Array:
operator=(constArray&rhs)intn=rhs.size;if(size!
=n)deletealist;alist=newTn;if(alist=NULL)Error(memoryAllocationError);size=n;T*destptr=alist;T*srcptr=rhs.alist;while(n-)*destptr+=*srcptr+;return*this;直接访问的线性群体23C+语言程序设计清华大学郑莉数组类的重载下标操作符函数数组类的重载下标操作符函数templateT&Array:
operator(intn)/检查下标是否越界检查下标是否越界if(nsize-1)Error(indexOutOfRange,n);/返回下标为返回下标为n的数组元素的数组元素returnalistn;直接访问的线性群体24C+语言程序设计清华大学郑莉为什么有的函数返回引用为什么有的函数返回引用l如果一个函数的返回值是一个对象的如果一个函数的返回值是一个对象的值,它就被认为是一个常量,不能成值,它就被认为是一个常量,不能成为左值。
为左值。
l如果返回值为引用。
由于引用是对象如果返回值为引用。
由于引用是对象的别名,所以通过引用当然可以改变的别名,所以通过引用当然可以改变对象的值。
对象的值。
直接访问的线性群体25C+语言程序设计清华大学郑莉重载指针转换操作符重载指针转换操作符templateA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chap9 C+ 课件 清华大学