C++语言程序设计(清华大学郑莉)九ppt课件.ppt
《C++语言程序设计(清华大学郑莉)九ppt课件.ppt》由会员分享,可在线阅读,更多相关《C++语言程序设计(清华大学郑莉)九ppt课件.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 群体类群体类和群体数据的组织和群体数据的组织清华大学清华大学 郑郑 莉莉C+语言程序设计C+语言程序设计清华大学 郑莉2本章主要内容本章主要内容l模板模板l群体类群体类l群体数据的组织群体数据的组织l深度探索深度探索C+语言程序设计清华大学 郑莉3第一部分:模板第一部分:模板l函数模板函数模板l类模板类模板C+语言程序设计清华大学 郑莉4函数模板函数模板l函数模板可以用来创建一个通用功能的函数,以函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数支持多种不同形参,进一步简化重载函数的函数体设计。体设计。l定义方法定义方法:template 函数定
2、义l模板模板参数表的内容参数表的内容 类型参数:class(或typename) 标识符 常量参数:类型说明符 标识符 模板参数:template class 标识符 函 数 模 板C+语言程序设计清华大学 郑莉5求绝对值函数的模板求绝对值函数的模板# #include include using namespace std;using namespace std;templatetemplate T T abs( abs(T T x x) ) return x 0? -x : x;return x 0? -x : x; intint main main() () intint n = - n
3、 = -5;5;double d = -double d = -5.5;5.5;coutcout abs( abs(n n) ) endlendl; ;coutcout abs( abs(d d) ) endlendl; ;return 0;return 0; 函 数 模 板运行结果:运行结果:55.5C+语言程序设计清华大学 郑莉6求绝对值函数的模板分析求绝对值函数的模板分析l编译器从调用编译器从调用abs()时实参的类型,推时实参的类型,推导出函数模板的类型参数。例如,对导出函数模板的类型参数。例如,对于调用表达式于调用表达式abs(n),由于实参,由于实参n为为int型,所以推导出模板中
4、类型参数型,所以推导出模板中类型参数T为为int。l当类型参数的含义确定后,编译器将当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:以函数模板为样板,生成一个函数:int abs(int x) return x 0 ? x : x; 函 数 模 板C+语言程序设计清华大学 郑莉7类模板的作用类模板的作用使用类模板使用户可以为类声明一使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类
5、型的和用户自定义类型)。类 模 板C+语言程序设计清华大学 郑莉8类模板的声明类模板的声明l类模板:类模板:template class 类名类成员声明l如果需要在类模板以外定义其成员如果需要在类模板以外定义其成员函数,则要采用以下的形式:函数,则要采用以下的形式:template 类型名 类名:函数名(参数表)类 模 板C+语言程序设计清华大学 郑莉9例例9-2 类模板应用举例类模板应用举例#include #include #include #include using namespace std;using namespace std;/ / 结构体结构体StudentStudentst
6、ruct Student struct Student int id; / int id; /学号学号 float gpa; /float gpa; /平均分平均分; ; 类 模 板template template class Store /class Store /类模板:实现对任意类型数据进行存取类模板:实现对任意类型数据进行存取private:private:T item;T item;/ item/ item用于存放任意类型的数据用于存放任意类型的数据bool haveValue; / haveValuebool haveValue; / haveValue标记标记itemitem是
7、否已被是否已被存入内容存入内容public:public:Store();Store();/ / 缺省形式(无形参)的构造函数缺省形式(无形参)的构造函数T &getElem();T &getElem();/提取数据函数提取数据函数void putElem(const T &x); /void putElem(const T &x); /存入数据函数存入数据函数;/以下实现各成员函数。以下实现各成员函数。template template /缺省构造函数的实现缺省构造函数的实现 Store:Store(): haveValue(false) Store:Store(): haveValue(f
8、alse) 10template /template /提取数据函数的实现提取数据函数的实现T &Store:getElem() T &Store:getElem() /如试图提取未初始化的数据,则终止程序如试图提取未初始化的数据,则终止程序if (!haveValue) if (!haveValue) cout No item present! endl;cout No item present! endl;exit(1);exit(1);/使程序完全退出,返回到操作系统。使程序完全退出,返回到操作系统。 return item; / return item; / 返回返回itemitem中
9、存放的数据中存放的数据 template template /存入数据函数的实现存入数据函数的实现 void Store:putElem(const T &x) void Store:putElem(const T &x) / / 将将haveValue haveValue 置为置为truetrue,表示,表示itemitem中已存入数值中已存入数值haveValue = true;haveValue = true;item = x;item = x;/ / 将将x x值存入值存入itemitem 11int main() int main() Store s1, s2;Store s1, s
10、2;s1.putElem(3);s1.putElem(3);s2.putElem(-7);s2.putElem(-7);cout s1.getElem() s2.getElem() endl;cout s1.getElem() s2.getElem() endl;Student g = 1000, 23 ;Student g = 1000, 23 ;Store s3;Store s3;s3.putElem(g); s3.putElem(g); cout The student id is s3.getElem().id endl;cout The student id is s3.getEle
11、m().id endl;Store d;Store d;cout Retrieving object D. ;cout Retrieving object D. ;cout d.getElem() endlcout d.getElem() endl/由于由于d d未经初始化未经初始化, ,在执行函数在执行函数D.getElement()D.getElement()过程中导致程序终过程中导致程序终止止return 0;return 0; 12C+语言程序设计清华大学 郑莉13第二部分:群体数据第二部分:群体数据l线性群体线性群体 线性群体的概念 直接访问群体-数组类 顺序访问群体-链表类 栈类
12、队列类C+语言程序设计清华大学 郑莉14群体的概念群体的概念群体群体是指由多个数据元素组成的集是指由多个数据元素组成的集合体。群体可以分为两个大类:合体。群体可以分为两个大类:线性群线性群体体和和非线性群体非线性群体。线性群体中的元素按位置排列有序,线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。可以区分为第一个元素、第二个元素等。非线性群体不用位置顺序来标识元非线性群体不用位置顺序来标识元素。素。C+语言程序设计清华大学 郑莉15线性群体的概念线性群体的概念线性群体中的元素次序与其位置关线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照系是对应的。在线性群体
13、中,又可按照访问元素的不同方法分为访问元素的不同方法分为直接访问直接访问、顺顺序访问序访问和和索引访问索引访问。在本章我们只介绍直接访问和顺序在本章我们只介绍直接访问和顺序访问。访问。第一个元素第二个元素第三个元素最后一个元素C+语言程序设计清华大学 郑莉16数组数组l静态数组是具有固定元素个数的群体,其静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。中的元素可以通过下标直接访问。 缺点:大小在编译时就已经确定,在运行时无法修改。l动态数组由一系列位置连续的,任意数量动态数组由一系列位置连续的,任意数量相同类型的元素组成。相同类型的元素组成。 优点:其元素个数可在程序运行时改
14、变。lvector就是用类模板实现的动态数组。就是用类模板实现的动态数组。l动态数组类模板:例动态数组类模板:例9-3(Array.h)直接访问的线性群体# #ifndefifndef ARRAY_H ARRAY_H#define ARRAY_H#define ARRAY_H#include #include template /template /数组类模板定义数组类模板定义class Array class Array private:private:T T* * list;/ list;/用于存放动态分配的数组内存首地址用于存放动态分配的数组内存首地址intint size; size;
15、 /数组大小(元素个数)数组大小(元素个数)public:public:Array(Array(intint szsz = 50); = 50);/构造函数构造函数Array(const Array &a);Array(const Array &a);/拷贝构造函数拷贝构造函数Array();Array();/析构函数析构函数Array & operator = (const Array &Array & operator = (const Array &rhsrhs); /); /重载重载=“=“T & operator (T & operator (intint i i); /); /重载
16、重载”const T & operator (const T & operator (intint i i) const;) const;operator T operator T * * (); (); /重载到重载到T T* *类型的转换类型的转换operator const T operator const T * * () const; () const;intint getSizegetSize() const;() const;/取数组的大小取数组的大小void resize(void resize(intint szsz););/修改数组的大小修改数组的大小;17动态数组类模板程
17、序C+语言程序设计清华大学 郑莉18数组类模板模板的构造函数数组类模板模板的构造函数/ / 构造函数构造函数template template Array:Array(int sz) Array:Array(int sz) /sz /sz为数组大小(元素个数),应当非负为数组大小(元素个数),应当非负assert(sz = 0);assert(sz = 0);/ / 将元素个数赋值给变量将元素个数赋值给变量sizesizesize = sz;size = sz;/动态分配动态分配sizesize个个T T类型的元素空间类型的元素空间list = new T size;list = new T
18、size; 直接访问的线性群体C+语言程序设计清华大学 郑莉19数组数组类模板的类模板的拷贝构造函数拷贝构造函数/拷贝构造函数拷贝构造函数template template Array:Array(const Array &a) Array:Array(const Array &a) /从对象从对象x x取得数组大小,并赋值给当前对象的成员取得数组大小,并赋值给当前对象的成员size = a.size;size = a.size;/为对象申请内存并进行出错检查为对象申请内存并进行出错检查list = new Tsize;/ list = new Tsize;/ 动态分配动态分配n n个个T T
19、类型的元素空间类型的元素空间/从对象从对象X X复制数组元素到本对象复制数组元素到本对象 for (int i = 0; i size; i+)for (int i = 0; i size; i+)listi = a.listi;listi = a.listi; 直接访问的线性群体C+语言程序设计清华大学 郑莉20浅拷贝浅拷贝 list sizeaa的数组元素占用的内存拷贝前 list sizeaa的数组元素占用的内存拷贝后 list sizebint main() int main() Array a(10); Array a(10); . . Array b(a); Array b(a);
20、 . . template template Array:Array(Array:Array(const Array& x) const Array& x) size = x.size; size = x.size; list = x.list; list = x.list; C+语言程序设计清华大学 郑莉21深拷贝深拷贝 list sizeaa的数组元素占用的内存拷贝前 list sizeaa的数组元素占用的内存拷贝后 list sizebb的数组元素占用的内存C+语言程序设计清华大学 郑莉22数组数组类类模板模板的的重载重载=运算符函数运算符函数/重载重载“=”“=”运算符运算符templ
21、ate template Array &Array:operator = (const Array& rhs) Array &Array:operator = (const Array& rhs) if (&rhs != this) if (&rhs != this) if (size != rhs.size) if (size != rhs.size) delete list;delete list;/删除数组原有内存删除数组原有内存size = rhs.size;size = rhs.size;/设置设置本对象的数组大小本对象的数组大小list = new Tsize;list = new
22、 Tsize; /重新分配重新分配n n个元素的内存个元素的内存 /从对象从对象X X复制数组元素到本对象复制数组元素到本对象 for (int i = 0; i size; i+)for (int i = 0; i size; i+)listi = rhs.listi;listi = rhs.listi; return return * *this;this;/返回当前对象的引用返回当前对象的引用 直接访问的线性群体C+语言程序设计清华大学 郑莉23数组数组类模板的类模板的重载下标操作符函数重载下标操作符函数template template T &Array:operator (T &Ar
23、ray:operator (intint n) n) assert(n = 0 & n = 0 & n size);/越界检查越界检查return listn;return listn; / /返回下标为返回下标为n n的数组元素的数组元素 template template const T &Array:operator (const T &Array:operator (intint n) const n) const assert(n = 0 & n = 0 & n size); /越界检查越界检查return listn;return listn; / /返回下标为返回下标为n n的数
24、组元素的数组元素 直接访问的线性群体C+语言程序设计清华大学 郑莉24为什么有的函数返回引用为什么有的函数返回引用l如果一个函数的返回值是一个对象的如果一个函数的返回值是一个对象的值,就不应成为左值。值,就不应成为左值。l如果返回值为引用。由于引用是对象如果返回值为引用。由于引用是对象的别名,通过引用当然可以改变对象的别名,通过引用当然可以改变对象的值。的值。直接访问的线性群体C+语言程序设计清华大学 郑莉25重载指针转换操作符重载指针转换操作符template template Array:operator T Array:operator T * * () () return list;r
25、eturn list; /返回私有数组的首地址返回私有数组的首地址 template template Array:operator const T Array:operator const T * * () const () const return list;return list; /返回私有数组的首地址返回私有数组的首地址 直接访问的线性群体C+语言程序设计清华大学 郑莉26指针转换运算符的作用指针转换运算符的作用#include #include using namespace std;using namespace std;void read(void read(int int *
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言程序设计 清华大学 ppt 课件
限制150内