C++实验报告类和对象 重载与继承 多态和模板 异常和流Word文件下载.docx
- 文档编号:18957404
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:32
- 大小:102.03KB
C++实验报告类和对象 重载与继承 多态和模板 异常和流Word文件下载.docx
《C++实验报告类和对象 重载与继承 多态和模板 异常和流Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++实验报告类和对象 重载与继承 多态和模板 异常和流Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
请输入矩形右上角坐标:
upperright.x>
upperright.y;
}
floatRectangle:
area()
return(upperright.x-lowerleft.x)*(upperright.y-lowerleft.y);
intmain()
Rectanglejuxing;
juxing.get();
floatresult;
result=juxing.area();
矩形面积为:
result<
endl;
return0;
运行结果如下:
2.设计并测试一个“人员”类。
属性包括:
编号、性别、出生日期、身份证号等等。
其中“出生日期”定义为一个“日期”类内嵌子对象。
用成员函数实现对人员信息的录入和显示。
要求包括:
构造函数和析构函数、拷贝构造函数、内联成员函数。
思路:
构造函数包括默认构造函数、带参构造函数、拷贝构造函数,在对象创建时调用构造函数,当用一个已存在的类实例去初始化另一个新创建的类实例时,系统会调用拷贝构造函数。
在对象消除时调用析构函数。
内联函数使用inline标识,在编译阶段,内联函数的函数体代码部分会被嵌入到每一个调用语句处,在程序执行阶段,不会发生程序的控制转移,而是直接运行在编译时嵌入的代码。
#include<
string>
classdate//日期类
intyear,month,day;
date(){year=0;
month=0;
day=0;
}//默认构造函数
date(inty,intm,intd);
//带参构造函数
~date(){};
//析构函数
date(date&
datep);
//拷贝构造函数
voidin()//数据输入函数
{cin>
year>
month>
day;
}
voidout()//显示输出函数
{cout<
year<
年"
month<
月"
<
day<
日"
}
};
classperson//人员类
{
stringname;
intnum;
stringsex;
datebirthday;
//内嵌子对象
stringID;
person(){name="
Hello"
num=0;
sex="
no"
ID="
0"
}//默认构造
person(stringna,intnu,stringse,datebirth,stringI);
//带参构造函数
~person(){}//析构函数
person(person&
p);
voidinput();
//信息输入,内联函数
voidshow();
//信息输出,内联函数
date:
date(inty,intm,intd)//date类构造函数的实现
year=y;
month=m;
day=d;
date(date&
datep)//date类拷贝构造函数的实现
year=datep.year;
month=datep.month;
day=datep.day;
person:
person(stringna,intnu,stringse,datebirth,stringI)//person构造函数的实现
num=nu;
sex=se;
ID=I;
birthday=date(birth);
//使用拷贝构造函数
name=na;
person(person&
p)//拷贝构造函数的实现
{
num=p.num;
sex=p.sex;
ID=p.ID;
name=p.name;
birthday=p.birthday;
}
inlinevoidperson:
input()//信息输入函数
请输入个人信息"
姓名:
name;
编号:
num;
性别:
"
sex;
出生日期:
birthday.in();
身份证号:
ID;
endl<
人员信息录入已完成!
\n\n"
show()//信息输出函数
人员信息显示如下:
name<
num<
性别:
sex<
birthday.out();
身份证号:
ID<
intmain()
datea(1990,1,1);
personxie("
谢端阳"
1,"
男"
a,"
1234567890"
);
//调用构造函数
personp;
//调用默认构造函数
p.show();
p=person(xie);
p.input();
运行结果:
3.声明一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;
静态成员函数GetHowMany(),获取HowManyCats。
设计程序测试这个类,体会静态数据成员和静态成员函数的用法。
默认HowManyCats为0。
在类Cat的构造函数里将HowManyCats加1,用函数GetHowMany()返回HowManyCats的值。
创建Cat类的对象a,此时HowManyCats变为1。
再创建对象b,在创建对象a后的HowManyCats基础上加1,变成2。
说明类的所有对象共享同一个静态类成员。
静态成员函数只能访问静态数据成员。
classCat
private:
staticintHowManyCats;
Cat(){HowManyCats++;
staticintGetHowMany(){returnHowManyCats;
intCat:
HowManyCats=0;
voidCat:
show()
cout<
Thereare"
Cat:
GetHowMany()<
catsalive!
//静态成员函数不能通过对象调用,不能使用this指针,如果静态成员函数是在公有部分声明,则可以使用类名和作用域解析符来调用它。
Cata;
a.show();
Catb;
b.show();
实验二重载和继承
1.实现如下字符串类String的各项功能,并编写测试程序。
classString{
char*str;
String(char*s=0);
String(constString&
intstrlenth(void)const;
intstrcmpp(constString&
)const;
//比较字符串
String&
operator=(constString&
//拷贝字符串
operator+=(constString&
//连接字符串
operatorconstchar*(void)const;
~String();
这题我写的的代码不好,请参考《C++PrimerPlus第五版》第十二章
表示字符串的方式有三种:
char数组;
用引号括起的字符串常量;
被设置为字符串的地址的char指针。
在本题的类String中,成员str是一个char指针,被设置为字符串的地址。
编写函数代码时,在有关字符串的复制操作中使用strcpy()函数,在比较操作中使用strcmp()函数。
重载*操作符后,可用于指向对象的指针。
cstring>
cstdlib>
char*str;
String(char*s);
String(constString&
a);
intStrlenth()const;
intStrcmpp(constString&
a)const;
String&
operatorconstchar*()const;
~String();
display();
String:
String(char*s)//构造函数
if(s==NULL)
{
str=newchar[1];
str[0]='
\0'
else
str=newchar[strlen(s)+1];
strcpy(str,s);
String(constString&
a)//拷贝构造函数
str=newchar[strlen(a.str)+1];
;
strcpy(str,a.str);
intString:
Strlenth()const
returnstrlen(str);
Strcmpp(constString&
a)const
intx;
x=strcmp(str,a.str);
if(x>
0)cerr<
elseif(x<
elsecerr<
="
returnx;
String:
operator=(constString&
a)
return*this;
operator+=(constString&
char*p=str;
str=newchar[strlen(a.str)+strlen(p)+1];
strcpy(str,p);
strcat(str,a.str);
operatorconstchar*()const
returnstr;
~String()
cerr<
调用析构函数"
delete[]str;
display()
//cerr<
字符串为:
puts(str);
char*p="
abcdefg"
char*q="
hijkl"
Strings1(p);
Strings2(q);
Strings3(s1);
//拷贝构造函数
s1:
s1.display();
字符串s1长度为:
s1.Strlenth()<
s2:
s2.display();
字符串s2长度为:
s2.Strlenth()<
s3:
s3.display();
字符串s3长度为:
s3.Strlenth()<
字符串比较结果(s1:
s2):
s1"
s1.Strcmpp(s2);
s2\n"
将s2拷贝给s3:
s3=s2;
连接s1与s2:
s1+=s2;
使用*操作符——String*s=newString(s1);
String*s=newString(s1);
s:
*s<
deletes;
问题分析:
在写比较函数Strcmpp时,错误的理解了strcmp(s1,s2)函数的返回值情况,返回值写成了strcmp(a.str,str)。
实际上,当s1<
s2时,stcmp返回负值,s1==s2时,返回0;
s1>
s2时,返回正值。
所以在函数s.Strcmpp(a)里,应返回strcmp(str,a.str).
2.分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。
要求:
(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。
(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
(4)在类体中声明成员函数,在类外定义成员函数。
(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。
多重继承指派生类有多个基类。
当两个基类中的数据成员有相同名字时,用:
:
操作符指定作用域,如cout<
职务:
Cadre:
post<
,又如在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数时用Teacher:
display();
classTeacher
{public:
Teacher(stringnam,inta,strings,stringtit,stringad,stringt);
voiddisplay();
protected:
intage;
stringtitle;
stringaddress;
stringtel;
Teacher:
Teacher(stringnam,inta,strings,stringtit,stringad,stringt):
name(nam),age(a),sex(s),title(tit),address(ad),tel(t){}
voidTeacher:
{cout<
姓名:
年龄:
age<
职称:
title<
地址:
address<
电话:
tel<
classCadre
Cadre(stringnam,inta,strings,stringp,stringad,stringt);
stringpost;
Cadre(stringnam,inta,strings,stringp,stringad,stringt):
name(nam),age(a),sex(s),post(p),address(ad),tel(t){}
voidCadre:
name:
age:
sex:
post:
address:
tel:
classTeacher_Cadre:
publicTeacher,publicCadre
Teacher_Cadre(stringnam,inta,strings,stringtit,stringp,stringad,stringt,floatw);
voidshow();
private:
floatwage;
Teacher_Cadre:
Teacher_Cadre(stringnam,inta,strings,stringt,stringp,stringad,stringtel,floatw):
Teacher(nam,a,s,t,ad,tel),Cadre(nam,a,s,p,ad,tel),wage(w){}
voidTeacher_Cadre:
show()
Teacher:
工资:
wage<
intmain()
Teacher_Cadrea("
张三"
50,"
"
高级"
教师"
子虚国乌有市贾雨路5号"
1234567"
3000);
a.show();
实验三多态与模板
1.声明一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()和GetPerim()函数,GetArea用来计算对象的面积,GetPerim用来计算对象的周长。
封装上述各类,并编写测试程序。
虚函数是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。
将基类Shape、派生类Rectangle和Circle中的GetArea()和GetPerim()函数都声明为虚函数virtual。
staticfloatpi=3.1415;
classShape{
Shape(){}
~Shape(){}
virtualfloatGetArea()=0;
virtualfloatGetPerim()=0;
classRectangle:
publicShape{
floatitsLength,itsWidth;
Rectangle(floatlen,floatwid):
itsLength(len),itsWidth(wid){}
~Rectangle(){}
virtualfloatGetArea(){returnitsLength*itsWidth;
virtualfloatGetPerim(){return2*(itsLength+itsWidth);
classCircle:
floatitsRadius;
Circle(floatr):
itsRadius(r){}
~Circle(){}
virtualfloatGetArea(){returnpi*itsRadius*itsRadius;
virtualfloatGetPerim(){return2*pi*itsRadius;
Shape*s;
s=newRectangle(5,2);
矩形面积:
s->
GetArea()<
矩形周长:
GetPerim()<
s=newCircle(10);
圆形面积:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+实验报告类和对象 重载与继承 多态和模板 异常和流 C+ 实验 报告 对象 重载 继承 模板 异常
![提示](https://static.bdocx.com/images/bang_tan.gif)