c12类的静态成员、模板类_第1页
c12类的静态成员、模板类_第2页
c12类的静态成员、模板类_第3页
c12类的静态成员、模板类_第4页
c12类的静态成员、模板类_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第十章第三讲:类的静态成员、模板类,C+语言程序设计,2,本章主要内容,类的静态成员模板群体类群体数据的组织,第一部分-类的静态成员,静态数据静态函数,静态数据,在类成员声明前加上static修饰即把该成员声明为该类的静态成员;静态成员是该类所有对象共有的成员;静态数据成员必须在定义第一个对象之前作为静态变量加以定义并初始化;公有静态成员可以在无任何对象的情况下访问。,类的静态成员,classMOD100/类的静态函数成员示例public:staticintadd(intx,inty)return(x+y)%100;staticintsub(intx,inty)return(x-y)%100;voidmain()coutMOD100:add(34,89)endl;coutMOD100:sub(34,199)endl;,静态数据,静态数据成员在生成的每个类对象中并不占有存储空间,只是在每个类中分配有存储空间。该类的所有对象和外部函数(在允许的访问属性下)都可以直接访问这个空间。类中声明静态成员后,不管具有的何种访问属性,都需要在类外定义并进行初始化。若没有对其进行初始化,则自动被赋予初值0.,类的静态成员,classXX/类的静态数据成员示例inta;public:staticintb;XX(intaa=0)a=aa;b+;intgeta()returna;intXX:b=0;/类外定义并初始化voidmain()coutXX:bendl;XXx(10),y(20);coutx.geta(),x.bendl;couty.geta(),y.bendl;,静态函数,静态成员函数只能访问静态数据成员或调用静态函数成员。若静态函数采用类外定义,则函数头不需要加static。静态函数也只属于一个类,而不属于一个对象。静态成员函数无this指针。,类的静态成员,classMOD100/类的静态函数成员示例public:staticintadd(intx,inty)return(x+y)%100;staticintsub(intx,inty);intMOD100:sub(intx,inty)return(x-y)%100;/函数外定义,10,第二部分模板,函数模板类模板,11,函数模板,函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。声明方法:template函数声明,函数模板,12,求绝对值函数的模板,#includeusingnamespacestd;templateTabs(Tx)returnx0?-x:x;voidmain()intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;,函数模板,运行结果:55.5,13,求绝对值函数的模板分析,编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:intabs(intx)returnx0?-x:x;,函数模板,14,类模板的作用,使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。,类模板,15,类模板的声明,类模板:templateclass类名类成员声明如果需要在类模板以外定义其成员函数,则要采用以下的形式:template类型名类名:函数名(参数表),类模板,16,例类模板应用举例,#include#includeusingnamespacestd;/结构体StudentstructStudentintid;/学号floatgpa;/平均分;,类模板,template/类模板:实现对任意类型数据进行存取classStoreprivate:Titem;/用于存放任意类型的数据inthaveValue;/用于标记item是否已被存入内容public:Store(void);/默认形式(无形参)的构造函数TGetElem(void);/提取数据函数voidPutElem(Tx);/存入数据函数;/默认形式构造函数的实现templateStore:Store(void):haveValue(0),17,template/提取数据函数的实现TStore:GetElem(void)/如果试图提取未初始化的数据,则终止程序if(haveValue=0)cout/存入数据函数的实现voidStore:PutElem(Tx)haveValue+;/将haveValue置为TRUE,表示item中已存入数值item=x;/将x值存入item,18,voidmain(void)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()next;returntempPtr;,tempPtr,27,链表的基本操作,生成结点插入结点查找结点删除结点遍历链表清空链表,顺序访问的线性群体,28,链表类模板,#ifndefLINKEDLIST_CLASS#defineLINKEDLIST_CLASS#include#includeusingnamespacestd;#ifndefNULLconstintNULL=0;#endif/NULL,顺序访问的线性群体,templateclassLinkedListprivate:Node*front,*rear;Node*prevPtr,*currPtr;intsize;intposition;Node*GetNode(constT,29,public:LinkedList(void);LinkedList(constLinkedList,30,voidInsertFront(constT#endif/LINKEDLIST_CLASS,31,32,链表类应用举例,#includeusingnamespacestd;voidmain(void)LinkedListLink;inti,key,item;for(i=0;iitem;Link.InsertFront(item);,顺序访问的线性群体,coutkey;Link.Reset();,33,while(!Link.EndOfList()if(Link.Data()=key)Link.DeleteAt();Link.Next();coutList:;Link.Reset();while(!Link.EndOfList()coutLink.Data();Link.Next();coutendl;,34,35,特殊的线性群体栈,栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底。,特殊的线性群体栈,36,栈的应用举例函数调用,特殊的线性群体栈,37,栈的应用举例表达式处理,特殊的线性群体栈,38,栈的基本状态,栈空栈中没有元素栈满栈中元素个数达到上限一般状态栈中有元素,但未达到栈满状态,特殊的线性群体栈,39,40,栈的基本操作,初始化入栈出栈清空栈访问栈顶元素检测栈的状态(满、空),特殊的线性群体栈,41,栈类模板,特殊的线性群体栈,constintMaxStackSize=50;templateclassStackTstacklistMaxStackSize;inttop;public:Stack(void);voidPush(constT,42,栈的应用,一个简单的整数计算器实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算3+5则输入35+。乘方运算符用表示。每次运算在前次结果基础上进行,若要将前次运算结果清除,可键入c。当键入q时程序结束。,特殊的线性群体栈,#include#include#include#includeusingnamespacestd;enumBooleanFalse,True;classCalculatorprivate:StackS;voidEnter(intnum);BooleanGetTwoOperands(int,43,voidCalculator:Enter(intnum)S.Push(num);BooleanCalculator:GetTwoOperands(int,44,voidCalculator:Compute(charop)Booleanresult;intoperand1,operand2;result=GetTwoOperands(operand1,operand2);if(result)switch(op)case+:S.Push(operand2+operand1);break;case-:S.Push(operand2-operand1);break;case*:S.Push(operand2*operand1);break;case/:if(operand1=0)cerrDivideby0!endl;S.ClearStack();elseS.Push(operand2/operand1);break;case:S.Push(pow(operand2,operand1);break;cout=S.Peek()c,*c!=q)switch(*c)casec:S.ClearStack();break;case-:if(strlen(c)1)Enter(atoi(c);elseCompute(*c);break;case+:case*:case/:case:Compute(*c);break;default:Enter(atoi(c);break;,46,voidCalculator:Clear(void)S.ClearStack();voidmain(void)CalculatorCALC;CALC.Run();,47,48,特殊的线性群体队列,队列是只能向一端添加元素,从另一端删除元素的线性群体,49,队列的基本状态,队空队列中没有元素队满队列中元素个数达到上限一般状态队列中有元素,但未达到队满状态,特殊的线性群体队列,元素移动方向,元素移动方向,50,51,循环队列,在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组

温馨提示

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

评论

0/150

提交评论