面向对象程序设计(C)-9.ppt_第1页
面向对象程序设计(C)-9.ppt_第2页
面向对象程序设计(C)-9.ppt_第3页
面向对象程序设计(C)-9.ppt_第4页
面向对象程序设计(C)-9.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第九章 群体类和群体数据的组织 面向对象语言程序设计(C+) 2 本章主要内容 o模板 o群体类 o群体数据的组织 o深度探索 3 第一部分:模板 o函数模板 o类模板 4 函数模板 o函数模板可以用来创建一个通用功能的函数 ,以支持多种不同形参,进一步简化重载函 数的函数体设计。 o定义方法: template 函数定义 o模板参数表的内容 nclass(或typename) n类型说明符(类型参数) T n模板参数:template class 标识符 函 数 模 板 5 求绝对值函数的模板 #include using namespace std; template T abs(T x) return x class 类名 类成员声明 o如果需要在类模板以外定义其成员函 数,则要采用以下的形式: template 类型名 类名:函数名 (参数表) 类 模 板 9 例9-2 类模板应用举例 #include #include using namespace std; / 结构体Student struct Student int id; /学号 float gpa; /平均分 ; 类 模 板 template class Store /类模板:实现对任意类型数据进行存取 private: T item;/ item用于存放任意类型的数据 bool haveValue; / haveValue标记item是否已被存入内 容 public: Store();/ 缺省形式(无形参)的构造函数 T /提取数据函数 void putElem(const T /存入数据函数 ; /以下实现各成员函数。 template /缺省构造函数的实现 Store:Store(): haveValue(false) 10 template /提取数据函数的实现 T item = x;/ 将x值存入item 11 int main() Store s1, s2; s1.putElem(3); s2.putElem(-7); cout s3; s3.putElem(g); cout d; cout template /数组类模板定义 class Array private: T* list;/用于存放动态分配的数组内存首地址 int size;/数组大小(元素个数) public: Array(int sz = 50);/构造函数 Array(const Array /拷贝构造函数 Array();/析构函数 Array /重载“=“ T /重载“” const T operator T * ();/重载到T*类型的转换 operator const T * () const; int getSize() const;/取数组的大小 void resize(int sz);/修改数组的大小 ; 17 动态数组类模板程序 18 数组类模板模板的构造函数 / 构造函数 template Array:Array(int sz) /sz为数组大小(元素个数),应当非负 assert(sz = 0); / 将元素个数赋值给变量size size = sz; /动态分配size个T类型的元素空间 list = new T size; 直接访问的线性群体 19 数组类模板的拷贝构造函数 /拷贝构造函数 template Array:Array(const Array /为对象申请内存并进行出错检查 list = new Tsize;/ 动态分配n个T类型的元素空间 /从对象X复制数组元素到本对象 for (int i = 0; i a(10); Array b(a); template Array:Array( const Array list = x.list; 21 深拷贝 list size a a的数组元素 占用的内存 拷贝前 list size a a的数组元素 占用的内存 拷贝后 list size b b的数组元素 占用的内存 22 数组类模板的重载“=“运算符函数 /重载“=”运算符 template Array /删除数组原有内存 size = rhs.size; /设置本对象的数组大小 list = new Tsize;/重新分配n个元素的内存 /从对象X复制数组元素到本对象 for (int i = 0; i T /返回私有数组的首地址 template Array:operator const T * () const return list;/返回私有数组的首地址 直接访问的线性群体 26 指针转换运算符的作用 #include using namespace std; void read(int *p, int n) for (int i = 0; i pi; int main() int a10; read(a, 10); return 0; #include “Array.h“ #include using namespace std; void read(int *p, int n) for (int i = 0; i pi; int main() Array a(10); read(a, 10); return 0; 直接访问的线性群体 27 Array类的应用 o例9-4求范围2N中的质数,N在程序运 行时由键盘输入。 直接访问的线性群体 #include #include #include “Array.h“ using namespace std; int main() Array a(10);/ 用来存放质数的数组,初始状态有10个元素。 int n, count = 0; cout = 2 as upper limit for prime numbers: “; cin n; for (int i = 2; i class Node private: Node *next; public: T data; Node(const T void insertAfter(Node *p); Node *deleteAfter(); Node *nextNode() const; ; 直接访问的线性群体 32 在结点之后插入一个结点 data1 data2 p data template void Node:insertAfter(Node *p) /p节点指针域指向当前节点的后继节点 p-next = next; next = p; /当前节点的指针域指向p 直接访问的线性群体 33 删除结点之后的结点 data1 data2 data3 Node *Node:deleteAfter(void) Node *tempPtr = next; if (next = 0) return 0; next = tempPtr-next; return tempPtr; tempPtr 直接访问的线性群体 34 链表的基本操作 o生成结点 o插入结点 o查找结点 o删除结点 o遍历链表 o清空链表 直接访问的线性群体 35 链表类模板(例9-6) #ifndef LINKEDLIST_H #define LINKEDLIST_H #include “Node.h“ template class LinkedList private: /数据成员: Node *front, *rear Node *prevPtr, *currPtr; int size; int position; Node *newNode(const T void freeNode(Node *p); void copy(const LinkedList public: LinkedList(); LinkedList(const LinkedList LinkedList(); LinkedList int getSize() const; bool isEmpty() const; void reset(int pos = 0 void next(); bool endOfList() const; int currentPosition(void) const; void insertFront(const T void insertRear(const T void insertAt(const T void insertAfter(const T T deleteFront(); void deleteCurrent(); T const T ; #endif /LINKEDLIST_H 直接访问的线性群体 36 链表类应用举例(例9-7) /9_7.cpp #include #include “LinkedList.h“ using namespace std; int main() LinkedList list; for (int i = 0; i item; list.insertFront(item); cout key; list.reset(); while (!list.endOfList() if (list.data() = key) list.deleteCurrent(); list.next(); cout o正确。Array是数据类型。 ntemplate reverse (Array o正确。T虽未定,但Array表示的是一个类模板实 例。 o同一模板在不同参数下的实例是完全无关的类型 n彼此不兼容,无法相互赋值 n通过Store的对象调用的成员函数,无法直接访问 Store对象的私有成员 37 深度探索 函数模板 vs 函数 o函数模板本身不是函数 n编译器不会为函数模板本身生成目标代码 n只有函数模板的实例能被调用 o例:考虑下列模板 template void outputArray(const T *array, int count); n若a是int数组,outputArray(a, 10)等价于 outputArray(a, 10),被调用的是 outputArray实例 38 深度探索 隐含实例化 o模板的实例化 n根据函数模板生成具体的函数、或根据类模 板生成具体的类的过程 o隐含实例化 n编译器会自动按需对模板实例化 n所有会被使用的模板实例会被生成 n对类模板的隐含实例化并不意味着对它成员 函数的定义也进行实例化,当类模板成员函 数会被使用时,才会被实例化 39 深度探索 多文件结构中模板的组织 o模板实例化机制带来的新问题 n不能把下面与模板相关的定义放在源文件中 o函数模板的定义 o类模板成员函数 o类模板静态数据成员 o解决方法 n把与模板相关的定义放在头文件中最通常 的解决办法 o编译器有特殊处理,保证不会有连接冲突 n使用export关键字编译器支持不好 n使用模板的显式实例化机制 40 深度探索 显式实例化 o语法形式 ntemplate 实例化目标的声明; o作用 n一个模板实例无论是否在本编译单元中被使用, 都会被生成 o例 ntemplate void outputArray(const int *array, int

温馨提示

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

评论

0/150

提交评论