已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象的程序设计c+第六章模板PPT文档 11面向对象程序设计(C+)面向对象程序设计第六章模板面向对象程序设计第六章模板C+Templates杨卫东左峥嵘华中科技大学自动化学院杨卫东左峥嵘华中科技大学自动化学院xx秋22面向对象程序设计(C+)参考资料?C+primer第四版?Effective C+3rd?C+Templates(简体中文版).pdf33面向对象程序设计(C+)内容?模板的定义?函数模板?类模板?标准模板库STL44面向对象程序设计(C+)问题提出实现一个函数,输入2个变量,输出这两个变量中值比较大的元素。 要求个变量,输出这两个变量中值比较大的元素。 要求:此函数可以接受int,char以及double类型的参数。 C语言实现:/函数1char MaxOfChar(char cNum1,char cNum2)return(cNum1cNum2)?cNum1:cNum2;/函数2int MaxOfInt(int iNum1,int iNum2)return(iNum1iNum2)?iNum1:iNum2;/函数3double MaxOfDouble(double dNum1,double dNum2)return(dNum1dNum2)?dNum1:dNum2;C语言55面向对象程序设计(C+)函数重载c+时代,由于存在重载的概念,所以实现起来应该是这个样子:/函数1char Max(char cNum1,char cNum2)return(cNum1cNum2)?cNum1:cNum2;/函数2int Max(int iNum1,int iNum2)return(iNum1iNum2)?iNum1:iNum2;/函数3double Max(double dNum1,double dNum2)return(dNum1dNum2)?dNum1:dNum2;#define MAX(x,y)(xy)?x:y)?函数名字统一?但代码量没有什么变化但代码量没有什么变化?能否进一步?C+66面向对象程序设计(C+)宏定义?宏定义#define Max(Inputl,Input2)(InputlInput2)?Inputl:Input2)?宏无类型检查,不建议77面向对象程序设计(C+)模板(函数模板)templateT Max(const T&Inputl,const T&Input2)return(InputlInput2)?Inputl:Input2;?可以接受任何类型的参数,包括上边提到的int,char,double,甚至任何自定义类型(只要你实现了它的比较运算符只要你实现了它的比较运算符operator)?具体选用什么样的实际函数是在编译时刻就决定好的,丝毫不会影响运行时的效率具体选用什么样的实际函数是在编译时刻就决定好的,丝毫不会影响运行时的效率88面向对象程序设计(C+)?Input参数中用的是const&的,好处是减少函数调用时候的开销,因为我们不知道的,好处是减少函数调用时候的开销,因为我们不知道T类型到底有多大99面向对象程序设计(C+)模板定义?代码重用是程序设计的重要特性,为实现代码重用,使得代码具有更好的通用性,需要代码不受数据类型的限制,自动适应不同的数据类型,实现参数化程序设计。 是程序设计的重要特性,为实现代码重用,使得代码具有更好的通用性,需要代码不受数据类型的限制,自动适应不同的数据类型,实现参数化程序设计。 模板是C+中进行通用程序设计的工具之一中进行通用程序设计的工具之一?模板是C+支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型?如希望函数或类能够处理多种不同类型数据,可以通过模板为函数或类设计一个通用样板如希望函数或类能够处理多种不同类型数据,可以通过模板为函数或类设计一个通用样板(通用数据类型通用数据类型),当处理实际数据时,根据给定数据的实际类型来确定,当处理实际数据时,根据给定数据的实际类型来确定10面向对象程序设计(C+)?模板是c+语言最强大却最少被使用的特征之一,便于重复利用已经开发好的数据结构和算法,可以提高代码的复用性和开发效率,是通用编程实现方法之一。 ?在c+中,模板让程序员能够定义一种使用不同类型对象的行为。 比如用模板类定义一种链表,那么通过不同的模板参数(在调用时提供),可以生成不同类型的链表?有点像宏,但是宏不是类型安全的,而模板是类型安全的?分函数模板和类模板两种模板的特点11面向对象程序设计(C+)6.1函数模板 1、数据类型作为参数的背景例求绝对值的函数、数据类型作为参数的背景例求绝对值的函数int abs(int x)return x0?-x:x;double abs(double x)return x0?-x:x;特点算法完全相同,仅仅只是数据类型不同。 (函数重载)问题能否以数据类型作为参数,实现通用代码设计。 12面向对象程序设计(C+) 2、模板模板是由可以使用任何数据类型的通用代码构成。 模板以数据类型作为参数。 模板的定义形式是、模板模板是由可以使用任何数据类型的通用代码构成。 模板以数据类型作为参数。 模板的定义形式是template函数定义说明函数定义说明template是关键字,表示定义的是模板。 括起来的是模板的参数,可以有一个或多个。 如template或者template13面向对象程序设计(C+) 3、例子定义一个求绝对值函数的模板。 #includetemplateT abs(T x)return x0?-x:x;void main()int n=-5;double d=-5.5;cout 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数。 以时,用其实参的类型推导出函数模板的类型参数。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数。 以abs(n)调用为例,编译器将生成一个函数int abs(int x)return x,2_TD31;18面向对象程序设计(C+)举例2矩阵templateclass Matrixpublic:/constructors anddestructorMatrix();Matrix(const Matrix&A);Matrix(int rows,int columns,const Type&x=Type (0);Matrix(int rows,int columns,const Type*v);Matrix();/assignmentsMatrix&operator=(const Matrix&A);Matrix&operator=(const Type&x);Test62_TmatrixsDemo.dsw19面向对象程序设计(C+)?模板是C+支持参数化的工具?使用类模板使用户可以为类声明一种模式,使类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能够取任意类型。 使类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能够取任意类型。 ?类模板的声明形式如下template类声明模板参数表为类声明模板参数表为?class标识符;如template?模板参数表包含上面多项内容时,各项内容以逗号分隔。 模板参数表包含上面多项内容时,各项内容以逗号分隔。 ?模板类的成员函数必须是函数模板6.2类模板20面向对象程序设计(C+)在类模板首部以外的成员函数定义都要以下面的形式开头。 在类模板首部以外的成员函数定义都要以下面的形式开头。 template与函数模板相同,类模板只有使用的时候才被具体化为某一种类型与函数模板相同,类模板只有使用的时候才被具体化为某一种类型?用模板类创建对象的一般形式模板用模板类创建对象的一般形式模板对象名1,对象名2,对象名,对象名n;模板参数表为用逗号分隔的若干类型标识符或常量表达式构成。 模板参数表为用逗号分隔的若干类型标识符或常量表达式构成。 6.2类模板21面向对象程序设计(C+)#include#include/结构体Studentstruct Studentint id;/学号float gpa;/平均分;template/类模板实现对任意类型数据进行存取class Storeprivate:T item;/item用于存放任意类型的数据int haveValue;/haveValue标记item是否已被存入内容public:Store(void);/缺省形式(无形参)的构造函数T GetElem(void);/提取数据函数void PutElem(T x);/存入数据函数;举例22面向对象程序设计(C+)/以下实现各成员函数。 /注意模板类的成员函数,若在类外实现,则必须是模板函数/缺省形式构造函数的实现templateStore:Store(void):haveValue (0)/提取数据函数的实现templateT Store:GetElem(void)/如果试图提取未初始化的数据,则终止程序if(haveValue=0)coutNo itempresent!item3?maxitem:item3;return maxitem;#endif/EXAMPLE9_1.CPP/主程序#include#includeEXAMPLE901.H#includeEXAMPLE901B.Hvoid main()MaxnmyMax(1,2,3);MaxdblmyMax(1.2,1.3,-1.4);coutptrNext=ptrNext;/将ptr的ptrNext指针指向本结点的后续结点ptrNext=ptr;/本结点的ptrNext指针指向ptr53面向对象程序设计(C+)templateListNode*ListNode:DeleteAfter()ListNode*ptrTemp=ptrNext;if(ptrNext=NULL)/处理本结点为尾结点时的情况return NULL;ptrNext=ptrTemp-ptrNext;/一般情况return ptrTemp;/链表类构造函数,4个私有指针成员设置为空,链表初始长度设置为0,初始当前结点/初始位置为-1templateLinkedList:LinkedList(void):ptrFront(NULL),ptrTail(NULL),ptrPrev(NULL),ptrCurr(NULL),nListLength (0),nPosition(-1)/重载=号运算符templateLinkedList&LinkedList:operator=(const LinkedList&list)54面向对象程序设计(C+)if(this!=&list)DeleteAll();CopyList(list);return*this;/拷贝构造函数templateLinkedList:LinkedList(const LinkedList&list)CopyList(list);/重新设置当前指针的位置templatevoid LinkedList:Reset(int nPos)int nStartPos;55面向对象程序设计(C+)if(!ptrFront)/如果当前指针为空,链表为空直接返回return;if(nPos=nListLength|nPos0)/位置越界检查cerrNextListNode();nPosition+;/将数据为nItem的结点插入到链表头template57面向对象程序设计(C+)void LinkedList:InsertFront(const T&nItem)ListNode*newListNode=GetListNode(nItem);/获得一个封装有该数据/的结点newListNode-SetNext(ptrFront);ptrFront=newListNode;nListLength+;/将数据为nItem的结点插入到链表尾templatevoid LinkedList:InsertTail(const T&nItem)ListNode*newListNode;if(ptrCurr=NULL)InsertFront(nItem);/若链表为空,使之成为头结点/(也是尾结点)else/一般情况while(ptrCurr-NextListNode()/寻找尾结点ptrCurr=ptrCurr-NextListNode();58面向对象程序设计(C+)newListNode=GetListNode(nItem);ptrCurr-InsertAfter(newListNode);/将数据为nItem的结点插入到链表的当前位置之前templatevoid LinkedList:InsertAt(const T&nItem)ListNode*newListNode;if(!ptrPrev)/插入到头结点newListNode=GetListNode(nItem,ptrFront);newListNode-SetNext(ptrFront);ptrFront=newListNode;nListLength+;else/一般情况59面向对象程序设计(C+)newListNode=GetListNode(nItem);ptrPrev-InsertAfter(newListNode);if(ptrPrev=ptrTail)ptrTail=newListNode;nPosition=nListLength;ptrCurr=newListNode;/将数据为nItem的结点插入到链表当前结点之后templatevoid LinkedList:InsertAfter(const T&nItem)ListNode*newListNode;if(!ptrCurr)/处理空链表的情况60面向对象程序设计(C+)newListNode=GetListNode(nItem);ptrCurr=newListNode;ptrFront=ptrCurr;else/一般情况newListNode=GetListNode(nItem);ptrCurr-InsertAfter(newListNode);if(ptrPrev=ptrTail)ptrTail=newListNode;nPosition=nListLength;ptrCurr=newListNode;nListLength+;/删除链表中的当前结点templatevoid LinkedList:DeleteCurr()61面向对象程序设计(C+)ListNode*ptr;if(!ptrCurr)/处理空链表的情况cerrThe Listis empty!NextListNode();else/一般情况ptr=ptrPrev-DeleteAfter();if(ptr=ptrTail)ptrTail=ptrPrev;nPosition-;ptrCurr=ptr-NextListNode();FreeListNode(ptr);62面向对象程序设计(C+)nListLength-;/删除链表中所有结点并释放资源templatevoid LinkedList:DeleteAll()ListNode*ptrCurrPos,*ptrNextPos;ptrCurrPos=ptrFront;while(ptrCurrPos)/循环处理删除链表中的各个结点ptrNextPos=ptrCurrPos-NextListNode();FreeListNode(ptrCurrPos);ptrCurrPos=ptrNextPos;ptrFront=NULL;ptrTail=NULL;ptrPrev=NULL;ptrCurr=NULL;63面向对象程序设计(C+)nListLength=0;nPosition=-1;/删除链表的头结点templateint LinkedList:DeleteHead()ListNode*ptr=ptrFront;if(ptrFront)ptrFront=ptrFront-NextListNode();delete ptr;nListLength-;return1;else/处理链表为空的情况coutShowDate();/逐项拷贝链表中的各个结点templatevoid LinkedList:CopyList(const LinkedList&list)ListNode*ptr=list.ptrFront;ptrCurr=NULL;while(ptr)/遍历list并创建新链表65面向对象程序设计(C+)InsertAfter(ptr-ShowDate();ptr=ptr-NextListNode();if(nPosition=-1)/list为空return;ptrPrev=NULL;ptrCurr=ptrFront;for(int nPos=0;nPos!=list.CurrPosition();nPos+)/将新链表的各个数据成员设置与原链表相同ptrPrev=ptrCurr;ptrCurr=ptrCurr-NextListNode();nPosition=nPos;nListLength=list.ListLength();66面向对象程序设计(C+)/获得下一个新结点,返回新结点地址templateListNode*LinkedList:GetListNode(const T&nItem,ListNode*preNext)ListNode*newListNode;newListNode=new ListNode(nItem,preNext);if(!newListNode)cerrMemory allocationfailure!NextListNode();return0;/删除链表中满足条件的结点template68面向对象程序设计(C+)void LinkedList:Delete(T key)ptrCurr=ptrFront;ptrPrev=NULL;if(!ptrCurr)return;while(ptrCurr&KG-*4&ptrCurr-ShowDate()!=key)/查找相应的结点ptrPrev=ptrCurr;ptrCurr=ptrCurr-NextListNode();nPosition+;if(ptrCurr)/如果找到该结点,删除它if(!ptrPrev)ptrFront=ptrFront-NextListNode();else ptrPrev-DeleteAfter();delete ptrCurr;/在排序链表中插入新结点构成新的排序链表69面向对象程序设计(C+)templatevoid LinkedList:InsertOrder(T nItem)ListNode*newList
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国稀土招聘笔试题及答案
- 新房换房协议书范本
- 文化活动共建协议书
- 交换公司车辆协议书
- 水暖地暖安装合同范本
- 槟榔行业保密协议书
- 栏杆劳务分包合同范本
- 楼上住户签合同范本
- 2025年绵阳市中考化学试卷真题(含答案)
- 食堂服务安全协议合同
- 《智能设备故障诊断》课件
- 2025年江苏南京鼓楼城市管养集团有限公司招聘笔试参考题库含答案解析
- 《2024 3598-T-469 天然气管道掺氢输送技术要求》知识培训
- 2025年CSCO胰腺癌诊疗指南解读
- 人防竣工验收方案
- 消毒供应质量控制指标(2024年版)
- 2025年四川省自然资源投资集团有限责任公司招聘笔试参考题库附带答案详解
- 2025高考数学专项讲义第03讲复数(原卷版+解析)
- 幼儿园新教师艺术领域培训
- 2024-2025学年山东省潍坊市高一上学期期中考试数学试题(解析版)
- 餐饮服务联合体招投标协议模板
评论
0/150
提交评论