1、类的数据成员提供对象属性,成员函数提供操作方法,方法是公共接口,用户通过调用方法实现对属性的访问。一、C+面向对象程序设计范例1. 二维坐标点point的C+描述【实验目的】用面向对象的方法定义一个简单的抽象数据结构,本例实验内容为坐标点的数据结构。学会如何用C+语言描述数据结构和算法,理解将数据集和在此数据集上的操作分开描述的方法。【数据结构】将坐标点数据结构定义为一个C+类Point,在其内部分别定义数据成员和成员函数。 (1) 数据成员:一个平面直角坐标系中的点有两个属性,它们是x轴上的水平坐标值和y轴上的垂直坐标值。在Point类中,这两个属性分别由数据成员x和y来表示,定义为doub
2、le类型的私有数据成员。(2) 操作方法:定义成员函数,为类的使用者提供服务接口。先设计允许对点对象进行的操作,再用C+描述实现操作的算法,并定义为类Point的成员函数。在本例中提供了两个操作:move()函数将一个Point对象移至另一位置,Show()函数输出Point对象的数据成员值。两个构造函数,分别用于建立缺省参数的对象和带参数的对象。【算法提示】缺省构造函数Point()将新建立的坐标点对象初始化为原点位置(,)。带参数的构造函数Point(double px,double py)允许用户建立对象时指定初始坐标位置。点对象的移动操作move()函数需要在调用时给出新位置参数。输出
3、坐标值为无参函数。以下是平面直角坐标系中的点的类定义,main()函数对类Point的属性和操作进行测试。【程序1.1】#include class Point /平面直角坐标系中的点private: double x; /水平坐标值 double y; /垂直坐标值public: Point()x = 0; y = 0; /缺省构造函数 Point(double px,double py)x = px;y = py;/带参数的构造函数 void move(double mx,double my)x = mx;y = my;/移动位置(修改坐标值) void Show()coutx=x y=y
4、endl;/输出坐标值;void main() Point a,b(12.5,34.8); /建立两个Point对象 cout点a的位置:; a.Show(); /输出点a的坐标值点b的位置: b.Show(); /输出点b的坐标值 a.move(45.6,57.8);点a移动后的位置:2. 使用模板建立坐标点point的数据结构,直接表示抽象数据类型【实验目的】将程序1.1数据结构的类型参数化(模板),实现更高层次的数据抽象。【算法提示】 Point的数据成员不使用固定的类型定义,而是用typename说明的虚拟类型名ptType作为变量的类型,在定义Point类的对象时,再用C+的基本类型
5、将对象的数据成员的类型实例化。这样做的好处是可以使用同一个类来定义不同数据类型的对象,提高代码的利用率。【程序1.2】template class Point /平面直角坐标系中的点 ptType x; /虚拟类型的水平坐标值 ptType y; /虚拟类型的垂直坐标值 Point(ptType px, ptType py)x = px; void move(ptType mx,ptType my)x = mx; /移动位置(修改坐标值) Point a(24,36); /建立整型的Point对象float b(12.5,34.8); /建立浮点型的Point对象 a.move(25,18);
6、 b.move(45.6,57.8);点b移动后的位置:注:定义模板的关键字typename可以用class代替。如:class ptType class Point与例中的template class Point具有相同功能。3. 利用Point类定义矩形类Rectangle【实验目的】了解复合数据结构的描述方法。矩形是一个包含坐标点的复合数据结构,在C+程序中将坐标点和矩形分别定义为具有继承关系的两个类,即定义矩形类Rectangle为Point的派生类。使用派生类的形式定义一个数据结构,其主要目的是提高基类的代码利用率,并使派生类的结构得到简化。基类和派生类的定义体现了C+继承机制的运用
7、,最大程度地提高了数据结构的利用率。【数据结构】派生的矩形类Rectangle有四个数据成员,其中左下角坐标点x和y由基类Point定义,派生类Rectangle能够继承下来作为自己的数据成员。为了在派生类的成员函数中自由访问基类定义的数据成员,需要将这些数据成员定义为被保护的(protected)访问权限。矩形的宽度width和高度height在派生类中定义。在矩形类中这四个数据成员的访问权限是相同的。【算法提示】(1) 基类Point定义的成员函数都可以由派生类Rectangle继承,在矩形对象中可以直接使用。(2) 若用一个点对象为新的矩形对象初始化,注意构造函数的写法。对基类成员的赋值
8、由基类的拷贝构造函数完成,例如利用点对象p3定义的矩形对象rt4,实际上使用了Point类的缺省拷贝构造函数。如果基类成员初始化比较复杂,如含有内存分配等要求,就需要重新定义基类的拷贝构造函数。【程序1.3】class Point /二维坐标点类protected: double x,y; double Getx()return x; /返回坐标点的x值 double Gety()return y; /返回坐标点的y值 void Move(double mx,double my)x = mx; /移动坐标点的位置/输出坐标点的属性值class Rectangle:public Point/矩形
9、类(Point的派生类,Point对象为矩形左下角的坐标点) double width,height; /矩形的宽度和高度 Rectangle()width=0; height=0; x=0;y=0;/缺省构造函数 Rectangle(double a,double b,double c,double d):Point(a,b)/带参数的构造函数 width = c; height= d; Rectangle(Point &pn):Point(pn)/带参数的构造函数,由点pn定义矩形左下角的位置 width = 1; height = 1; double Area()return width
10、*height; /求矩形的面积 void Set(double a,double b)x=a;y=b; /重置矩形的左下角坐标 int Position(Point &pt); /求点pt相对于矩形的位置,返回-1(在矩形内),/ 0(在矩形边上)和1(在矩形外) void Judge(Point & /判断点pt相对于矩形的位置,给出提示 void Show(); /输出矩形的各属性值和面积int Rectangle:Position(Point &pt)/求点pt相对于矩形的位置 if(pt.Getx()x+width|pt.Gety()y+height) return 1; /在矩形外
11、 else if(pt.Getx()x & pt.Getx()y&pt.Gety()y+height) return -1; /在矩形内 else return 0; /在矩形边上void Rectangle:Judge(Point &pt) pt.Show(); Show(); switch(Position(pt) case 0:cout点在矩形边上endlbreak; case -1:点在矩形内 case 1:点在矩形外Show() /输出矩形的各属性值和面积rx=try=width=widthheight=heightarea=Area(),输出运算符),这是实现数据封装的常用技术。【
12、程序1.4】friend class Rectangle; /矩形类是点类的友元friend ostream &operator(Rectangle a); /重载关系运算符“”position(Point &pt) /求点pt相对于矩形的位置 if(pt.xpos.x+width|pt.ypos.y+height) return 1; else if(pt.xpos.x&pt.xpos.y&pt.ypos.y+height) return -1; /在矩形边上judge(Point &pt)/判断点pt相对于矩形的位置,给出提示 Point: /输出点pt的各属性值 switch(posit
13、ion(pt)Show() /输出矩形的位置、大小和面积pos.x,pos.y(Rectangle a) /重载关系运算符“”,比较矩形的面积 if(Area()a.Area() return 1;ostream &out,Rectangle &rg)/重载运算符输出矩形的各属性值 outrg.pos.xrg.pos.yrg.widthrg.heightrt3)cout矩形rt2比rt3大! else cout矩形rt3比rt2大!二、C+面向对象程序设计练习1. 定义三维空间的坐标点TPoint2. 描述三维空间的球TBall,实现其主要操作(如计算体积和表面积,输出空间坐标等)。第2章 线
14、性表了解线性数据结构,掌握顺序存储和链式存储的两种线性表的建立和使用方法。一、经典算法和例题1. 顺序表的模板类【实验目的】本例给出了较完整的顺序表的抽象数据类型定义,通过C+类模板的应用体现了数据抽象原理。【问题描述】定义一个顺序存储的线性表数据结构,在应用程序(main函数)中建立一个整型的线性表对象,在该表中进行插入、删除、查找和输出等操作。【数据结构】定义一个顺序存储的线性表类SeqList,数据成员包括表的存储数组,表的最大允许长度,表中最后元素下标等。定义常用的基本操作。(1) 在表示顺序表的SeqList类定义中,表元素的存储空间是数组data,采用动态内存分配方式。表的初始化工作由构造函数实现。(2) 顺序表的基本操作以公用接口形式(类的成员函数)提供。一般顺序表最常用的操作是输出、插入、删除、查找和求表长度等,其中数据量较大的输出操作采用运算符重载的方式来实现,以便用户能以习惯的cout形式输出表的全部元素。程序2.1给出顺序表的C+类声明和部分操作的实现。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1