面向对象程序设计实验讲义_第1页
面向对象程序设计实验讲义_第2页
面向对象程序设计实验讲义_第3页
面向对象程序设计实验讲义_第4页
面向对象程序设计实验讲义_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计实验讲义TOC\o"1-5"\h\z\o"CurrentDocument"实验一封装机制 1\o"CurrentDocument"一、 实验目的 1\o"CurrentDocument"二、 实验内容 1\o"CurrentDocument"三、 实验要求 3\o"CurrentDocument"四、 思考与练习 4\o"CurrentDocument"实验二继承机制 5\o"CurrentDocument"一、 实验目的 5\o"CurrentDocument"二、 实验内容 5\o"CurrentDocument"三、 实验要求 7\o"CurrentDocument"四、 思考与练习 7\o"CurrentDocument"实验三虚函数和动态绑定 8\o"CurrentDocument"一、 实验目的 8\o"CurrentDocument"二、 实验内容 8\o"CurrentDocument"三、 实验要求 11\o"CurrentDocument"四、 思考与练习 11\o"CurrentDocument"实验四运算符重载. 12\o"CurrentDocument"一、 实验目的 12\o"CurrentDocument"二、 实验内容 12\o"CurrentDocument"三、 实验要求 14\o"CurrentDocument"四、 思考与练习 14\o"CurrentDocument"实验五文件I/O 15\o"CurrentDocument"一、 实验目的 15\o"CurrentDocument"二、 实验内容 15\o"CurrentDocument"三、 实验要求 16\o"CurrentDocument"四、 思考与练习 17\o"CurrentDocument"附录VISUALC++实验环境介绍 18\o"CurrentDocument"一、 VisualC++简介 18\o"CurrentDocument"二、控制台应用 18实验一封装机制一、 实验目的掌握面向对象的基本概念,类的定义方法;掌握类成员的访问权限及访问类成员的方法;掌握内联函数;掌握构造函数与析构函数的意义及使用方法。二、 实验内容【范例】设计一个程序,定义一个矩形类,包括数据成员和函数成员。要求有构造函数、析构函数,完成赋值、修改、显示等功能的接口,并编写main函数测试,要求用一个对象初始化另一对象。【分析】要确定一个矩形(四边都是水平或垂直方向,不能倾斜),只要确定其左上角和右下角的x和y坐标即可,因此应包括四个数据成员,left,right,top,bottom,即左右上下四个边界值。由构造函数对数据成员赋值,赋值函数完成未初始化的矩形赋值,修改函数可以修改各数据成员,显示函数则画出该矩形。【程序1】所有原代码作为一个文件保存#include<iostream.h>classRectangle{intleft,top;intright,bottom;public:Rectangle(intl=0,intt=0,intr=0,intb=0);〜Rectangle(){};//析构函数,在此函数体为空voidAssign(intl,intt,intr,intb);voidSetLeft(intt){left=t;}//以下四个函数皆为内联成员函数voidSetRight(intt){right=t;}voidSetTop(intt){top=t;}voidSetBottom(intt){bottom=t;}voidShow();};//构造函数,带缺省参数,缺省值为全0,在声明中指定Rectangle::Rectangle(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;voidRectangle::Assign(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;}voidRectangle::Show(){cout<<"left-toppointis("<<left<<","<<top<<")"<<'\n';cout<<"right-bottompointis("<<right<<","<<bottom<<")"<<'\n';}voidmain(){Rectanglerect;rect.Show();rect.Assign(100,200,300,400);rect.Show();Rectanglerect1(0,0,200,200);rect1.Show();Rectanglerect2(rect1);rect2.Show();}//将上述所有内容保存为rect.cpp(也可自命名)【程序2】类的界面、类的实现以及main函数分开保存classRectangle{intleft,top;intright,bottom;public:Rectangle(intl=0,intt=0,intr=0,intb=0);〜Rectangle(){};//析构函数,在此函数体为空voidAssign(intl,intt,intr,intb);voidSetLeft(intt){left=t;}//以下四个函数皆为内联成员函数voidSetRight(intt){right=t;}voidSetTop(intt){top=t;}voidSetBottom(intt){bottom=t;}voidShow();};//将上述内容保存为rect.h#include<iostream.h>#include“rect.h”//构造函数,带缺省参数,缺省值为全0,在声明中指定Rectangle::Rectangle(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;}voidRectangle::Assign(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;}voidRectangle::Show(){cout<<”left-toppointis(”<<left<<”,”<<top<<”)”<<’\n’;cout<<”right-bottompointis(”<<right<<”,”<<bottom<<”)”<<’\n’;}//将上述内容保存为rect.cpp#include<iostream.h>#include“rect.h”voidmain(){Rectanglerect;rect.Show();rect.Assign(100,200,300,400);rect.Show();Rectanglerect1(0,0,200,200);rect1.Show();Rectanglerect2(rect1);rect2.Show();}//将上述内容保存为Exp6_1.cpp三、实验要求创建工程,录入上述源程序,以1个文件和多文件组织两种形式保存工程,建立可执行文件并执行,观察结果;哪些函数是内联的?为什么?其他函数怎样说明为内联的?修改上述程序,以键盘输入的方式输入矩形的坐标值,修改后再执行。四、思考与练习定义一个圆类(Circle),属性为半径(radius)和圆周长、面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。要求定义构造函数(以半径为参数,缺省值为0,周长和面积在构造函数中生成)和拷贝构造函数。实验二继承机制一、 实验目的掌握继承与派生的关系及方法;掌握在派生类构造函数中初始化基类成员;掌握多重继承的方法;二、 实验内容【范例】定义一个继承与派生关系的类体系,在派生类中访问基类成员。【分析】定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;定义一个直线类,以两个点类对象作数据成员,定义显示、求面积及长度函数。编程测试所定义的类体系。【程序】#include<iostream.h>#include<math.h>#definePI3.14159classPoint{friendclassLine;protected:doublex,y;public:Point(){x=0;y=0;}Point(doublexv,doubleyv){x=xv;y=yv;}doubleArea(){return0;}voidShow(){coutvv"x="vvxvv''vv"y="vvyvvendl;}};classCircle:publicPoint{doubleradius;public:Circle(){x=0;y=0;radius=0;}Circle(doublexv,doubleyv,doublevv):Point(xv,yv){〃调用基类构造函数radius=vv;}doubleArea(){returnPI*radius*radius;}voidShow(){//访问基类的数据成员cout<<"x="<<x<<''<<"y="<<y<<"radius="<<radius<<endl;}};classLine{Pointstart,end; //X对象成员public:Line():start(0,0),end(0,0){} 〃对象成员初始化Line(doublexv1,doubleyv1,doublexv2,doubleyv2):start(xv1,yv1),end(xv2,yv2){}doubleGetLength(){returnsqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}doubleArea(){return0;}voidShow(){cout<<"startpoint:\n";start.Show();cout<<"endpoint:\n";end.Show();}};voidmain(){Pointpt(0,0);Circlecl(100,100,10);Lineln1(0,0,100,100);cout<<pt.Area()<<endl;pt.Show();cout<<cl.Area()<<endl;cl.Show();cout<<ln1.Area()<<'\t'<<ln1.GetLength()<<endl;ln1.Show();【注意】在Point类中,将Line类定义为友元,方便在Line中访问;Point的x和y定义为Protected访问权限,便于派生类访问。注意派生类的构造函数中对基类数据成员的初始化方法,以及构造函数中对对象成员的初始化。三、 实验要求建立工程,录入上述程序,改变数据实验之。修改CPoint类数据成员x,y的访问权限为private,再运行,结果如何?如果不将CLine设为CPoint的友元,应采取什么措施?为哪个类增加数据或函数成员?四、 思考与练习使用多重继承和虚基类实现工资管理。【要求】某公司雇员(employee)包括经理(manager),技术人员(technician)和销售员(salesman)o开发部经理(developermanger),既是经理也是技术人员(salesmanager)。销售部经理(salesmanager),既是经理也是销售员。【提示】以employee类为虚基类派生出manager,technician和salesman类;再进一步多重派生出developermanager和salesmanager类。employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(page()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。technician类派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。salesman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。manager类派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。而developermanager类,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。salesamanager类,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。【注意】pay()应用同名覆盖的方法。要求有拷贝构造函数,并测试是否正确。实验三虚函数和动态绑定一、 实验目的在掌握继承与派生关系的基础上,进一步理解虚函数与多态型的关系;掌握运行时的多态性的实现。二、 实验内容【范例】使用虚函数和抽象基类对实验二进行改进。【要求】定义一个抽象基类CElement,提供显示、求面积等公共接口(虚函数),派生出CPoint、CLine、CCircle、CArc等图形元素类,并重定义(override)这些虚函数,完成各自的任务。再定义一个CElemList链表类,存储CElement的派生类。然后定义main函数,生成多个图形元素插入链表中,通过链表的头指针逐个访问链表中的元素,输出所有图形元素。在这里,CElement是抽象基类,它不能提供具体的显示等操作,应将其成员函数定义为纯虚函数。只有采用指向基类的指针或对基类的引用进行调用,实现的才是动态联编,完成运行时的多态性。[程序]#include<iostream.h>#include<math.h>doubleconstPI=3.14159;classCElement{public:virtualvoidShow()=0;virtualdoubleArea()=0;CElement*Next;};classCPoint:publicCElement{friendclassCLine;protected:doublex,y;public:CPoint(){x=0;y=0;}CPoint(doublexv,doubleyv){x=xv;y=yv;}doubleArea(){return0;}voidShow(){cout<<"x="<<x<<''<<"y="<<y<<endl;}};classCCircle:publicCPoint{doubleradius;public:CCircle(){x=0;y=0;radius=0;}CCircle(doublexv,doubleyv,doublevv):CPoint(xv,yv){radius=vv;}doubleArea(){returnPI*radius*radius;}voidShow(){coutvv"x="vvxvv' 'v<"y="vvy«' '<<"radius="vvradius«' 'vv"Area="<<Area()<<endl;}};classCLine:publicCElement{CPointstart,end;public:CLine():start(0,0),end(0,0){}CLine(doublexv1,doubleyv1,doublexv2,doubleyv2):start(xv1,yv1),end(xv2,yv2){};doubleGetLength(){returnsqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}doubleArea(){return0;}voidShow(){cout<<"startpoint:\n";start.Show();cout<<"endpoint:\n";end.Show();coutvv"Length="vvGetLength()vvendl;}};

CElement*head;//链表头指针定义为基类类型public:CElemList():head(NULL){}~CElemList();voidInsert(CElement*); //插入元素intDelete(CElement*); //删除元素voidShow(); //显示所有元素CElement*GetHead(){returnhead;} //取得链表头};CElemList::~CElemList(){CElement*p=head,*p2;while(p){CElement*head;//链表头指针定义为基类类型public:CElemList():head(NULL){}~CElemList();voidInsert(CElement*); //插入元素intDelete(CElement*); //删除元素voidShow(); //显示所有元素CElement*GetHead(){returnhead;} //取得链表头};CElemList::~CElemList(){CElement*p=head,*p2;while(p){p2=p;p=p->Next;deletep2;}return;}voidCElemList::Insert(CElement*elem){elem->Next=head;//在表头插入结点在表头插入结点}intCElemList::Delete(CElement*elem){CElement*p1=head,*p2=head;while(p1&&p1!=elem)p2=p1,p1=p1->Next;if(p1==elem){if(p1!=head)p2->Next=p1->Next;elsehead=head->Next;deletep1;return1;}elsereturn0;}voidCElemList::Show(){

CElement*p=head;while(p){//通过基类指针调用派生类成员函数,实现运行时多态性p->Show();p=p->Next;}return;}voidmain(){CElemListlist;//定义链表类对象CElement*p1=newCLine(100,100,100,200);list.Insert(p1);list.Show();cout<<endl;p1=newCCircle(200,100,20);list.Insert(p1);list.Show();cout<<endl;list.Delete(p1);list.Show();cout<<endl;}三、 实验要求建立工程,录入上述程序,改变数据实验之。若将CElement的两个虚函数virtual关键词删除,再运行,结果如何?为保证类的通用性,析构函数总是定义为虚函数,修改之。养成这种习惯。四、 思考与练习修改实验二中思考与练习题,pay()采用虚函数,动态联编。实验四运算符重载一、 实验目的掌握友元函数和友元类的应用;掌握运算符重载为成员函数和友元函数的方法。二、 实验内容【范例】为实验一的Rectangle类增加加减复合赋值和加减运算符重载函数。加减复合赋值语义定义为固定长方形的左上角,对右下角的坐标进行加减运算,使新矩形的长宽为原两矩形长宽之和或差,对加和减复合赋值定义为成员函数。两个矩形加减运算定义为友元函数。[程序]#include<iostream.h>classRectangle{intleft,top;intright,bottom;public:Rectangle(intl=0,intt=0,intr=0,intb=0);〜Rectangle(){};//析构函数,在此函数体为空voidAssign(intl,intt,intr,intb);voidSetLeft(intt){left=t;}//以下四个函数皆为内联成员函数voidSetRight(intt){right=t;}voidSetTop(intt){top=t;}voidSetBottom(intt){bottom=t;}voidShow();voidoperator+=(Rectangle&);voidoperator-=(Rectangle&);friendRectangleoperator+(Rectangle&,Rectangle&);friendRectangleoperator-(Rectangle&,Rectangle&);};Rectangle::Rectangle(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;voidRectangle::Assign(intl,intt,intr,intb){left=l;top=t;right=r;bottom=b;}voidRectangle::Show(){cout<<"left-toppointis("<<left<<","<<top<<")"<<'\n';cout<<"right-bottompointis("<<right<<","<<bottom<<")"<<'\n';}voidRectangle::operator+=(Rectangle&rect){intx=rect.right-rect.left;inty=rect.bottom-rect.top;right+=x;bottom+=y;}voidRectangle::operator-=(Rectangle&rect){intx=rect.right-rect.left;inty=rect.bottom-rect.top;right-=x;bottom-=y;}Rectangleoperator-(Rectangle&rect1,Rectangle&rect2){//矩形相减,从recti中减去rect2的长度和宽度recti-=rect2;returnrect1;}Rectangleoperator+(Rectangle&rect1,Rectangle&rect2){//矩形相加,从recti中加上rect2的长度和宽度recti+=rect2;returnrecti;}voidmain(){Rectanglerect;rect.Show();rect.Assign(I00,200,300,400);rect.Show();Rectanglerecti(0,0,200,200);recti.Show();rect+=recti;rect.Show();rect-=recti;rect.Show();Rectanglerect2;rect2=rect+recti;rect2.Show();rect2=rect-recti;rect2.Show();}三、 实验要求建立工程,录入上述程序,改变数据实验之。若将加减运算重载为成员函数,如何实现?为矩形类再增加一个静态数据成员Counter,统计共产生了多少个矩形对象。为Counter添加定义、赋初值及随程序运行而变化的代码,并在main函数中对其输出。注意静态数据成员应该有定义性说明。四、 思考与练习改善复数类,增加重载的运算符:-、-二、*=和/=,实现完整的复数的加减乘除运算,定义++为辐角不变而模加1,重载前后++(++对普通的复数表达方式a+ib为:a+a/sqrt(a*a+b*b),b+b/sqrt(a*a+b*b))。并定义main函数检测之。要求分别重载为成员函数和友元函数。实验五文件I/O一、 实验目的1.掌握文件流的打开、读写与关闭;2.掌握文件的随机访问;掌握用构造函数打开文件来创建对象,用析构函数撤销对象并存入文件。二、 实验内容【范例】建立一个应用程序,包括数据输入、存盘、读盘、操作数据后存储。通过随机数函数rand()产生20个整数,逐个将这些数以二进制方式写入文件file.dat中。然后读出这些数,在内存中对它们进行增序排序,再将排序后的数以文本方式逐个写入file.out文件中。【程序】用C++的文件流进行文件管理,用流类的函数进行文件读写。#include<iostream.h>#include<math.h>#include<stdlib.h>#include<fstream.h>#include<iomanip.h>voidsort(int[],int);main(){fstreamdat,out; //定义文件流对象inti,a[20],b[20];dat.open("file.dat”,ios::binary|ios::out|ios::in);//为读写打开二进制文件if(!dat){cout<<("cannotopenfile\n");exit(0);}for(i=0;i<20;i++){a[i]=rand();dat.write((char*)&a[i],sizeof(int));//将二十个数写入文件}dat.seekg(0); //将文件指针移至文件头for(i=0;i<20;i++){dat.read((char*)&b[i],sizeof(int));//读出二十个数sort(b,20); //调用排序函数out.open("file.out",ios::out); 〃为输出打开文本文件if(!out){cout<<"cannotopenfile\n";exit(0);}for(i=0;i<20;i++){ //将排序后数据写入文本文件out<<b[i]<<'';}out<<'\n';for(i=0;i<20;i++)cout<<b[i]<<'';cout<<"\n";out.close(); 〃关闭文件dat.close();return0;}voidsort(intx[],intm){ //排序函数inti,j,k,t;for(i=0;i<m-1;i++){k=i;for(j=i+1;j<m;j++)if(x[j]<x[k])k=j;if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}}}程序执行后,file.out文件中内容为:41491299548275436570563349961114781194215724168271846719169232812446426500269622814529358三、实验要求建立工程,录入上述程序,改变数据实验之。改造为一个类:a[20],b[20]为私有数据成员;在构造函数中用随机数发生器为a[]赋值,并打开两个文件;在析构函数中关闭文件;其余各种操作定义为成员函数。四、思考与练习两个文件中各有若十个以递增次序排列的实数,编写一个程序将这两个文件中的数统一排序后写入到一个新的文件中。并检验新文件数据是否正确。附录VisualC++实验环境介绍一、VisualC++简介VisualC++是Microsoft公司的VisualStudio开发工具箱中的一个C++程序开发包。VisualStudio提供了一整套开发Internet和Windows应用程序的工具,包括VisualC++,VisualBasic,VisualFoxpro,VisualInterDev,VisualJ++以及其他辅助工具,如代码管理工具VisualSourceSafe和联机帮助系统MSDN。VisualC++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。从最早期的1.0版本,发展到最新的6.0版本,VisualC++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。VisualC++一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。VisualC++集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。VisualC++软件包中的DeveloperStudio就是一个集成开发环境,它集成了各种开发工具和VC编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。IDE中还提供大量在线帮助信息协助程序员做好开发工作。DeveloperStudio中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如AppWizard和ClassWizard),以及MFC类库,这些都可以帮助程序员快速而正确地开发出应用程序。二、控制台应用用AppWizard建立一个控制台应用,在终端上输出”Hello”。术语:“控制台应用程序”是一个在DOS窗口中运行的基于字符的程序。1)创建第一个应用首先创建一个项目(project),项目将代表你的应用,存放你应用的所有信息,包括源文件、资源文件、编译连接设置等。创建项目的步骤为:(1) 启动DeveloperStudio(2) 从主菜单中选择File|New,将显示出New对话框(3) 选择Projects标签,并从列表中单击Win32ConsoleApplication在“Location”编辑框中输入你的工作目录名称,如c:\student\your_name在对话框的右上角的“projectname”编辑框内键入项目的名字,如”Hello”,系统将自动为你的项目分配一个默认的目录单击OK继续如果是VC6.0,系统将显示一个询问项目类型的程序向导,选择“anemptyproject”单击Finish或OK结束配置,创建应用程序这时系统为你创建一个新的项目,并且在左边的工

温馨提示

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

评论

0/150

提交评论