淮海工学院计算机科学系.docx
《淮海工学院计算机科学系.docx》由会员分享,可在线阅读,更多相关《淮海工学院计算机科学系.docx(15页珍藏版)》请在冰点文库上搜索。
![淮海工学院计算机科学系.docx](https://file1.bingdoc.com/fileroot1/2023-6/29/80647654-d178-443c-a4a7-64f4588f9920/80647654-d178-443c-a4a7-64f4588f99201.gif)
淮海工学院计算机科学系
淮海工学院计算机科学系
实验报告书
课程名:
《VC++程序设计》
题目:
类的定义与实现
班级:
计算机054
学号:
110511414
姓名:
马媛媛
目的与要求
编程实现类的定义,掌握C++面向对象基本特性,如抽象、继承、重载、多态,理解虚函数、构造函数、析构、模板等基本概念与基本语法
实验内容或题目
1.定义时间类Time,给出类的成员属性及构造函数、析构函数及普通方法的定义,利用定义的类定义对象,并对对象的属性进行访问;
2.定义一个类Point,然后定义类Point的派生类Circle,再定义Circle的派生类Cylinder;
3.通过函数参数类型的不同实现函数重载;
4.函数模板的定义与使用。
5.书上习题——编写一个工资管理程序,将雇员类作为所有类的基类,其派生类包括经理类,销售员类,计件工类和小时工类。
经理享有固定的周薪;销售员的收入是一小部分的基本工资加上销售额的提成;计件工的收入完全取决于其生产的工件数量;小时工的收入以小时计算,再加上加班费。
实验步骤与源程序
1启动VisualC++6.0,进入控制台应用模式;
2/
(1)编写实验内容1的代码,代码如下:
#include
classTime{
private:
inthour;
intminute;
intsecond;
public:
Time(int,int,int);//构造函数
~Time();//析构函数
//......
};
Time:
:
Time(inth,intm,ints)
{
hour=h;//对私有成员变量初始化
minute=m;
second=s;
cout<<"Theconstructorbecalled:
"<'<'<}
Time:
:
~Time()
{
cout<<"Thedestructorbecalled:
"<'<'<}
//......
voidmain(void)
{
Timet1(10,35,55);//声明对象t1,自动调用构造函数
Timet2(16,53,9);//声明对象t2,自动调用构造函数
}//退出main()主函数时自动调用对象t2、t1的析构函数
分析:
当创建一个对象时,系统都会自动地调用对象的构造函数对其进得初始化。
而当撤销一个对象时,系统会调用对象的析构函数,然后释放对象所占的空间。
但是析构函数的调用顺序与构造函数的调用顺序相反。
本题就是依次调用t1和t2构造函数,最后程序结束时,就是先调用t2的析构函数,然后就是t1的析构函数。
(2)编写实验内容2的代码,代码如下:
#include
classPoint//定义基类Point
{
protected:
intx,y;
public:
Point(inta=0,intb=0)//含有缺省参数值的构造函数也是默认的构造函数
{x=a;y=b;cout<<"Pointconstructor:
"<<'['<~Point()
{cout<<"Pointdestructor:
"<<'['<};
classCircle:
publicPoint//定义类Point的派生类
{
protected:
intradius;
public:
Circle(inta=0,intb=0,intr=0):
Point(a,b)//显式调用基类的构造函数
{radius=r;cout<<"Circleconstructor:
"<<'['<~Circle()
{cout<<"Circledestructor:
"<<'['<};
classCylinder:
publicCircle//定义类Circle的派生类
{
protected:
intheight;
public:
Cylinder(inta=0,intb=0,intr=0,inth=0):
Circle(a,b,r)//显式调用基类的构造函数
{height=h;cout<<"Cylinderconstructor:
"<<'['<<<'['<~Cylinder()
{cout<<"Cylinderdestructor:
"<<'['<};
main()
{
Cylindercylinder(200,300,100,400);//调用了类Point、Circle和Cylinder的构造函数
}
分析:
这里Point类是Circle类的基类,而Circle类是Cylinder类的基类,在调用派生类的构造函数构建对象时,系统会首先调用基类的构造函数构建基类对象。
当派生类对象的生存期结束时,析构函数的调用顺序与构造函数相反,也就是先调用派生类的析构函数,然后调用基类的析构函数。
(3)编写实验内容3的代码,代码如下:
#include
classComplex
{
private:
//声明为私有成员,能够在成员函数(运算符函数)中访问
floatr;//实部
floati;//虚部
public:
Complex(floatx=0,floaty=0){r=x;i=y;};
Complexoperator+(Complex);
voidDisplay(){cout<};
ComplexComplex:
:
operator+(Complexother)//利用成员函数重载运算符
{
Complextemp;
temp.r=this->r+other.r;//可以省略this指针
temp.i=this->i+other.i;
returntemp;
}
voidmain()
{
Complexcomplex1(3.34f,4.8f),complex2(12.8f,5.2f);
Complexcomplex;
complex=complex1+complex2;//进行两个复数的相加运算
complex.Display();
}
分析:
本题是对于运算符重载的运用,上例中的重载运算符为+,声明为Complexoperator+(Complex);然后调用的在complex=complex1+complex2;通过运算符重载从而实现复数和加法运算。
(4)编写实验内容3的代码,代码如下:
#include
template//使用2个类型参数
classMyTemClass//定义模板类
{
private:
T1x;
T2y;
public:
MyTemClass(T1a,T2b){x=a;y=b;};
voidShowMax(){cout<<"MaxMember="<<(x>=y?
x:
y)<};
voidmain()
{
inta=100;
floatb=123.45F;
MyTemClassmt(a,b);//声明模板类的对象
mt.ShowMax();
}
分析:
类模板可用来生成多个功能相同而某些数据成员的类型不同或成员函数的参数及返回值的类型不同的类。
声明的的样子如上:
template//使用2个类型参数
classMyTemClass//定义模板类
{
//.........
};
声明模板类的对象则是:
MyTemClassmt(a,b);这里的对象为mt,而变量a和b的类型分别为MyTemClass中的int和float型。
(5)课后习题程序代码:
//工资管理程序
#include"iostream.h"
#include"string.h"
#include"stdlib.h"
classEmployee
{
public:
charName[27];
intAge;
char*Postion;
intSalary;
public:
show()
{
cout<<"姓名:
"<cout<<"年龄:
"<cout<<"职位:
"<cout<<"工资:
"<}
};
classManager:
publicEmployee
{
public:
voidset_manager(char*name,intage,intweek)
{
strcpy(Name,name);
Age=age;
Salary=week*2000;
Postion="Manager";
}
};
classSaleman:
publicEmployee
{
public:
voidset_saleman(char*name,intage,intsell)
{
strcpy(Name,name);
Age=age;
Salary=(500+sell*0.15);
Postion="Saleman";
}
};
classNum_worker:
publicEmployee
{
public:
voidset_numworker(char*name,intage,intnumber)
{
strcpy(Name,name);
Age=age;
Salary=5*number;
Postion="Worker";
}
};
classTime_worker:
publicEmployee
{
public:
voidset_timeworker(char*name,intage,inttime)
{
strcpy(Name,name);
Age=age;
Salary=10*time;
Postion="Worker";
}
};
voidmain()
{
while
(1)
{
cout<<"========================================"<cout<<"||工资管理系统||"<cout<<"========================================"<cout<<"||1.经理.2.销售人员.||"<cout<<"||3.计件工.4.计时工.||"<cout<<"||5.退出.||"<cout<<"||=====================================||"<cout<<"||请选择操作||"<cout<<"========================================="<inta;
cout<<"选择操作:
";
cin>>a;
switch(a)
{
case1:
{
intage,week;
charname[20];
Managermanager;
cout<<"输入信息:
"<cout<<"姓名:
";
cin>>name;
cout<<"年龄:
";
cin>>age;
cout<<"工作周次:
";
cin>>week;
manager.set_manager(name,age,week);
cout<<"输出信息:
"<manager.show();
}
break;
case2:
{
intage,sell;
charname[20];
Salemansaleman;
cout<<"输入信息:
"<cout<<"姓名:
";
cin>>name;
cout<<"年龄:
";
cin>>age;
cout<<"销售量:
";
cin>>sell;
saleman.set_saleman(name,age,sell);
cout<<"输出信息:
"<saleman.show();
}break;
case3:
{
intage,number;
charname[20];
Num_workernum_worker;
cout<<"输入信息:
"<cout<<"姓名:
";
cin>>name;
cout<<"年龄:
";
cin>>age;
cout<<"工件个数:
";
cin>>number;
num_worker.set_numworker(name,age,number);
cout<<"输出信息:
"<num_worker.show();
}break;
case4:
{
intage,time;
charname[20];
Time_workertime_worker;
cout<<"输入信息:
"<cout<<"姓名:
";
cin>>name;
cout<<"年龄:
";
cin>>age;
cout<<"工作时间:
";
cin>>time;
time_worker.set_timeworker(name,age,time);
cout<<"输出信息:
"<time_worker.show();
}break;
case5:
default:
exit
(1);break;
}
}
}
测试数据与实验结果
(1)实验结果:
Theconstructorbecalled:
10:
35:
55
Theconstructorbecalled:
16:
53:
9
Thedestructorbecalled:
16:
53:
9
Thedestructorbecalled:
10:
35:
55
Pressanykeytocontinue
(2)实验结果:
Pointconstructor:
[200,300]
Circleconstructor:
[100][200,300]
Cylinderconstructor:
[400][100][200,300]
Cylinderdestructor:
[400][100][200,300]
Circledestructor:
[100][200,300]
Pointdestructor:
[200,300]
Pressanykeytocontinue
(3)实验结果:
16.14+10i
Pressanykeytocontinue
(4)实验结果:
MaxMember=123.45
Pressanykeytocontinue
(5)
========================================
||工资管理系统||
========================================
||1.经理.2.销售人员.||
||3.计件工.4.计时工.||
||5.退出.||
||=====================================||
||请选择操作||
=========================================
选择操作:
1
输入信息:
姓名:
zhangsan
年龄:
30
工作周次:
1
输出信息:
姓名:
zhangsan
年龄:
30
职位:
Manager
工资:
2000
结果分析与实验体会
这次实验我们学习了编程实现类的定义和C++面向对象基本特性,明白了面向对象方法具有封装性、继承性、多态性几大特点,函数重载是指一组功能类似但函数参数类型不同的函数可以共用一个函数名,而运算符重载则是指对于不同数据类型的操作数,同一个运算符所代表的运算功能可以不同.