面向对象程序设计实验2.docx
《面向对象程序设计实验2.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验2.docx(12页珍藏版)》请在冰豆网上搜索。
面向对象程序设计实验2
《实验07:
类与对象》实验报告
实验序号:
07 实验项目名称:
类与对象
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
类是C++扩展数据类型,可以封装不同类型的数据成员和函数成员,类是面向对象程序设计的基础。
本次实验内容包括面向对象的基本概念、构造函数与析构函数,从实际问题抽象出类等,通过实验要求:
1、掌握面向对象的基本概念,类的定义方法;
2、掌握类成员的访问权限及访问类成员的方法;
3、掌握内联函数;
4、掌握引用概念及应用,引用作为函数参数;
5、掌握构造函数与析构函数的意义及使用方法。
6、掌握友员函数、友员类的使用,以及运算符重载为成员函数和友元函数的方法。
二、实验设备(环境)及要求
微型计算机;windows操作系统;MicrosoftVisualStudio6.0集成开发环境;MicrosoftVisualStudio6.0集成开发环境的MSDN。
三、实验内容与步骤
1、【范例】设计一个程序,定义一个矩形类,包括数据成员和函数成员。
【提示】要求有构造函数、析构函数,完成赋值、修改、显示等功能的接口,并编写main函数测试,要求用一个对象初始化另一个对象。
【分析】要确定一个矩形(四边都是水平或垂直方向,不能倾斜),只要确定其左上角和右下角的x和y坐标即可,因此应包括四个数据成员,eft,right,top,bottom,即左右上下四个边界值。
由构造函数对数据成员赋值,赋值函数完成未初始化的矩形赋值,修改函数可以修改
各数据成员,显示函数则画出该矩形。
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();
voidDraw(CDC*pDC);
};
//将上述内容保存为rect.h
#include
#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(”<cout<<”right-bottompointis(”<}
voidRectangle:
:
Draw(CDC*pDC){
pDC->Rectangle(left,top,right,bottom);
}
//将上述内容保存为rect.cpp
#include
#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();
}
//将上述内容保存为Exp.cpp
【提示】Draw成员函数需要一个CDC指针参数,CDC是MFC中的设备上下文类,控制程序的图形输出,其成员函数Rectangle输出一个矩形,在这里不作要求。
运行程序是可以去掉这一函数。
【要求】
●创建工程,录入上述源程序,以多文件组织保存工程,建立可执行文件并执行,观察结果;哪些函数是内联的?
为什么?
其他函数怎样说明为内联的?
● 修改上述程序,以键盘输入的方式输入矩形的坐标值,修改后再执行。
2、构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时间,其中月请用枚举类型,并完成测试。
3、定义一个圆类(Circle),属性为半径(radius)和圆周长、面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。
要求定义构造函数(以半径为参数,缺省值为0,周长和面积在构造函数中生成)和复制构造函数。
4、为复数类(Complex)增加重载的运算符-、-=、*=和/=。
设++为实部和虚部各自增一,亦请重载前置与后置++运算符。
分别使用成员函数和友元函数各做一遍。
并测试。
解:
注意后++,返回的是原值,但实部和虚部已各自增一,所以要先保留原值,再++。
这里是使用成员函数。
5、内置数据类型可以进行类型强制转换,类也可以进行同样的转换,这是通过定义类型转换函数实现的。
它只能是类的成员函数,不能是友元函数。
格式为:
类名:
:
operator转换后的数据类型(){…}
如:
operatorfloat()是转换为浮点数的成员函数。
使用时的格式为:
float(对象名);或(float)对象名;
定义人民币类,数据成员包括:
圆、角、分,均为整型。
类型转换函数将人民币类强制转换为浮点数,以圆为单位。
并编程进行检验。
四、实验结果与数据处理
2.
3.
4.
5.
五、分析与讨论
六、教师评语
签名:
日期:
成绩
附件:
源代码
2.
#include"stdafx.h"
#include
enummonth_std{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEPT,OCT,NOV,DEC};
classtimedate
{
public:
voidsettime(intYear,enummonth_stdMonth,intDay,intHour,intMinute,intSecond);
voidshowtime()const;
private:
intyear,day,hour,minute,second;
enummonth_stdmonth;
};
voidtimedate:
:
settime(intYear,enummonth_stdMonth,intDay,intHour,intMinute,intSecond)
{year=Year;month=Month;day=Day;hour=Hour;minute=Minute;second=Second;}
voidtimedate:
:
showtime()const
{cout<<""<"<"<intmain()
{
intuyear,umonth_1,uday,uhour,uminute,usecond;
enummonth_stdumonth;
timedatetime1;
cout<<"请输入时间(年月日时分秒,空格间距,月份输入数字)"<cin>>uyear>>umonth_1>>uday>>uhour>>uminute>>usecond;
umonth=(enummonth_std)umonth_1;
time1.settime(uyear,umonth,uday,uhour,uminute,usecond);
time1.showtime();
cout<return0;
}
3.
#include"stdafx.h"
#include
classCircle
{public:
Circle();
Circle(double);
Circle(constCircle&p);
voidshow()const;
private:
doubleradius,circumference,area;
};
Circle:
:
Circle()
{radius=0;circumference=0;area=0;}
Circle:
:
Circle(doubleradius_1)
{radius=radius_1;circumference=2*3.14*radius_1;area=3.14*radius_1*radius_1;}
Circle:
:
Circle(constCircle&p)
{radius=p.radius;circumference=p.circumference;area=p.area;}
voidCircle:
:
show()const
{cout<<"radiuis"<intmain()
{doubler_input;
cout<<"Inputradiu:
\n";
cin>>r_input;
Circlecircle1(r_input);
Circlecircle2=circle1;
circle1.show();
circle2.show();
return0;
}
4.
#include"stdafx.h"
#include
classcomplex
{
private:
intx,y;//x+yi复数
public:
complex();
complex(int,int);
~complex(){}
voidpoint()const;
complexoperator+(complex&);
complexoperator-(complex&);
complexoperator*(complex&);
complexoperator/(complex&);
voidoperator+=(complex&);
voidoperator-=(complex&);
voidoperator*=(complex&);
voidoperator/=(complex&);
voidoperator+=(int);
voidoperator-=(int);
voidoperator*=(int);
voidoperator/=(int);
complexoperator++();
complexoperator++(int);
complexoperator--();
complexoperator--(int);
};
complex:
:
complex(){x=0;y=0;}
complex:
:
complex(inta,intb){x=a;y=b;}
voidcomplex:
:
point()const
{cout<complexcomplex:
:
operator+(complex&p1)//+
{complexp2;p2.x=x+p1.x;p2.y=y+p1.y;returnp2;}
complexcomplex:
:
operator-(complex&p1)//-
{complexp2;p2.x=x-p1.x;p2.y=y-p1.y;returnp2;}
complexcomplex:
:
operator*(complex&p1)//*
{complexp2;p2.x=x*p1.x;p2.y=y*p1.y;returnp2;}
complexcomplex:
:
operator/(complex&p1)///
{complexp2;
p2.x=(x*p1.x+y*p1.y)/(p1.x*p1.x+p1.y*p1.y);
p2.y=(y*p1.x-x*p1.y)/(p1.x*p1.x+p1.y*p1.y);
returnp2;}
voidcomplex:
:
operator+=(complex&p1)//+=
{x=x+p1.x;y=y+p1.y;}
voidcomplex:
:
operator-=(complex&p1)//-=
{x=x-p1.x;y=y-p1.y;}
voidcomplex:
:
operator*=(complex&p1)//*=
{x=x*p1.x;y=y*p1.y;}
voidcomplex:
:
operator/=(complex&p1)///=
{
x=(x*p1.x+y*p1.y)/(p1.x*p1.x+p1.y*p1.y);
y=(y*p1.x-x*p1.y)/(p1.x*p1.x+p1.y*p1.y);
}
voidcomplex:
:
operator+=(intt)
{x=x+t;y=y+t;}
voidcomplex:
:
operator-=(intt)
{x=x-t;y=y-t;}
voidcomplex:
:
operator*=(intt)
{x=x*t;y=y*t;}
voidcomplex:
:
operator/=(intt)
{x=x/t;y=y/t;}
complexcomplex:
:
operator++()//++
{x++;y++;return*this;}
complexcomplex:
:
operator--()//--
{x--;y--;return*this;}
complexcomplex:
:
operator++(int)
{complextemp(*this);x++;y++;returntemp;}
complexcomplex:
:
operator--(int)
{complextemp(*this);x--;y--;returntemp;}
intmain()
{
complextext1(5,4);
complextext2(9,8);
complextext3,text4;
cout<<"复数1为";text1.point();cout<<"\n复数2为";text2.point();cout<<"\n复数3为";text3.point();cout<<"\n";
text3=text1+text2;cout<<"1+2=";text3.point();cout<text3=text1-text2;cout<<"1-2=";text3.point();cout<text3=text1*text2;cout<<"1*2=";text3.point();cout<text3=text1/text2;cout<<"1/2=";text3.point();cout<text2+=text1;cout<<"2+=1:
";text2.point();cout<text2-=text1;cout<<"2-=1:
";text2.point();cout<text2*=text1;cout<<"2*=1:
";text2.point();cout<text2/=text1;cout<<"2/=1:
";text2.point();cout<cout<<"1=";text1.point();cout<text2=text1++;cout<<"1++:
";text2.point();cout<++text1;cout<<"++1:
";text1.point();cout<text2=text1--;cout<<"1--:
";text2.point();cout<--text1;cout<<"--1:
";text1.point();cout<return0;
}
5.
#include"stdafx.h"
#include
classRMB
{
public:
RMB(){yuan=0;jiao=0;fen=0;}
RMB(inta,intb,intc){yuan=a;jiao=b;fen=c;}
~RMB(){}
voidpoint()const
{cout<voidzhengli()
{if(fen/10!
=0){jiao+=(fen/10);fen%=10;}
if(jiao/10!
=0){yuan+=(jiao/10);jiao%=10;}}
operatorfloat()
{floatjieguo;jieguo=float(yuan+0.1*jiao+0.01*fen);
returnjieguo;}
private:
intyuan,jiao,fen;
};
intmain()
{RMBtext1(35,15,87);
floattext2;
cout<<"text数据为:
";
text1.point();
cout<<"\n整理后的数据为:
";
text1.zhengli();
text1.point();
text2=float(text1);
cout<<"\n转换后的结果为:
"<return0;
}