C++3实验报告.docx
- 文档编号:6079442
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:19
- 大小:23.42KB
C++3实验报告.docx
《C++3实验报告.docx》由会员分享,可在线阅读,更多相关《C++3实验报告.docx(19页珍藏版)》请在冰点文库上搜索。
C++3实验报告
《C++面相对象程序》课程实验报告
(I类)
实验3函数重载与运算符重载
3.1实验目的
1.学习函数和操作符重载的使用方法。
2.理解函数和运算符重载的作用和意义。
3.掌握类运算符和友元运算符重载的定义和使用。
4.掌握常用运算符的重载。
3.2实验工具与准备工作
在开始实验前,应回顾或复习相关内容。
需要一台主算机,其中安装有VisualC++6.0、Visualstudio2010等集成开发环境软件。
3.3实验内容
1.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
//文件名:
main.cpp
#include
usingnamespacestd;//使用标准命名空间std
//数组类
classArray
{
private:
//数据成员:
int*elem;//数组元素存储空间
intsize;//数组元素个数
public:
//公有函数:
Array(inta[],intsz):
elem(a),size(sz){}//构造函数
intGetSize(){returnsize;}//返回数组元素个数
int&operator[](intpos){returnelem[pos-1];}//重载下标运算符[]
};
intmain(void)//主函数main(void)
{
inta[]={1,2,3,4,5};//定义数组a
Arrayobj(a,5);//定义数组对象
obj[1]=8;//为数组元素赋值
for(inti=1;i<=obj.GetSize();i++)//依次输出数组各元素之值
cout< cout< system("PAUSE");//调用库函数system(),输出系统提示信息 return0;//返回值0,返回操作系统 } 程序运行结果正确为: 2.程序填空。 下面程序主要实现描述复数的类Complex的加法运算符+重载,试完成程序。 //文件名: main.cpp #include usingnamespacestd;//使用标准命名空间std //复数类 classComplex { private: //数据成员: doublerealPart;//实部 doubleimagePart;//虚部 public: //公有函数: Complex(doublereal=0,doubleimage=0): realPart(real),imagePart(image){}//构造函数 doubleGetRealPart()const{returnrealPart;}//返回实部 doubleGetImagePart()const{returnimagePart;}//返回虚部 Complexoperator+(constComplex&a)const//重载加法运算符+ { Complexb;//定义复数对象 b.realPart=this->realPart+a.realPart;//和的实部 b.imagePart=this->imagePart+a.imagePart;//和的虚部 returnb;//返回和 } }; intmain(void)//主函数main(void) { Complexa(1,2),b(2,6),c;//定义复数对象 c=a+b;//复数加法运算 cout<<"a="< cout<<"b="< cout<<"c="< system("PAUSE");//调用库函数system(),输出系统提示信息 return0;//返回值0,返回操作系统 } 3.改正下面程序中的错误,使其能正常运行。 //文件名: main.cpp//1 #include usingnamespacestd;//使用标准命名空间std//3 //4 //整型类//5 classInteger//6 {//7 private: //8 //数据成员: //9 intval;//整数值//10 //11 public: //12 //公有函数: //13 Integer(){val=0;}//无参数的构造函数//14 Integer(intv){val=v;}//带参数的构造函数//15 voidShow(){cout< };//17 //18 intmain(void)//主函数main(void)//19 {//20 Integera (2),b;//定义整型对象//21 a.Show();//显示a//22 b.Show();//显示b//23 //24 system("PAUSE");//调用库函数system(),输出系统提示信息//25 return0;//返回值0,返回操作系统//26 }//27 4.设计一个日期类Date,,要求: (1)包含年(year)、月(month)和日(day)私有数据成员。 (2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符<<与输入运算符>>等。 源程序如下: //文件名: main.cpp #include usingnamespacestd;//使用标准命名空间std //日期类 classDate { private: //数据成员: intyear;//年 intmonth;//月 intday;//日 public: //公有函数: Date(inty=1,intm=1,intd=1): year(y),month(m),day(d){}//构造函数 voidSetYear(inty){year=y;}//设置年 voidSetMonth(intm){month=m;}//设置月 voidSetDay(intd){day=d;}//设置日 intGetYear()const{returnyear;}//返回年 intGetMonth()const{returnmonth;}//返回月 intGetDay()const{returnday;}//返回日 Dateoperator+(intdays);//返回当前日期加上天数后得到的日期 Dateoperator-(intdays);//返回当前日期减去天数后得到的日期 staticboolIsLeapyear(inty);//判断年份y是否为润年 staticintGetYearDays(inty);//年份y的天数 staticintGetMonthDays(constDate&d);//日期d当前月份的天数 staticintDateToNum(constDate&d);//返回从公元1年1月1日起的天数 staticDateNumToDate(intn);//由从公元1年1月1日起的天数返回日期 }; ostream&operator<<(ostream&out,constDate&d);//重载输出运算符 istream&operator>>(istream&in,Date&d);//重载输入运算符>> //日期类及相关函数的实现部分 DateDate: : operator+(intdays)//返回当前日期加上天数后得到的日期 { intn=DateToNum(*this)+days;//从公元1年1月1日起的天数 returnNumToDate(n);//返回日期 } DateDate: : operator-(intdays)//返回当前日期减去天数后得到的日期 { intn=DateToNum(*this)-days;//从公元1年1月1日起的天数 returnNumToDate(n);//返回日期 } boolDate: : IsLeapyear(inty)//判断年份y是否为润年 { if(y%4==0&&y%100! =0||y%400==0)returntrue;//润年 elsereturnfalse;//平年 } intDate: : GetYearDays(inty)//年份y的天数 { if(IsLeapyear(y))return366;//润年有366天 elsereturn365;//平年有366天 } intDate: : GetMonthDays(constDate&d)//日期d当前月份的天数 { intn;//天数 switch(d.GetMonth()) { case1: case3: case5: case7: case8: case10: case12: n=31;//第1,3,5,7,8,10,12月为大月 break; case4: case6: case9: case11: n=31;//第4,6,9,11月为小月 break; case2: if(IsLeapyear(d.GetYear()))n=29;//润年2月有29天 elsen=28;//平年2月有29天 } returnn;//返回当前月份的天数 } intDate: : DateToNum(constDate&d)//返回从公元1年1月1日起的天数 { inty,n=0;//年份与天数 for(y=1;y n+=GetYearDays(y); for(intm=1;m n+=GetMonthDays(Date(y,m,1)); n+=d.GetDay();//累加当前月过的天数 returnn;//返回天数 } DateDate: : NumToDate(intn)//由从公元1年1月1日起的天数返回日期 { inty,m,d,rest=n;//年,月,日和剩余天数 for(y=1,rest=n;rest>GetYearDays(y);y++)//计算年份 rest-=GetYearDays(y); for(m=1;rest>GetMonthDays(Date(y,m,1));m++)//计算月份 rest-=GetMonthDays(Date(y,m,1)); d=rest;//日 returnDate(y,m,d);//返回日期 } ostream&operator<<(ostream&out,constDate&d)//重载输出运算符 { out< returnout;//返回输出流 } istream&operator>>(istream&in,Date&d)//重载输入运算符>> { intyear,month,day;//年月日 cin>>year>>month>>day;//输入年月日 d=Date(year,month,day);//转换成日期 returnin;//返回输入流 } intmain(void)//主函数main(void) { Dated(2008,8,18);//定义日期对象 cout<<"日期: "< cout<<"日期+10: "< cout<<"日期-10: "< cout<<"输入日期: "; cin>>d;//输出日期 cout<<"日期: "< system("PAUSE");//调用库函数system(),输出系统提示信息 return0;//返回值0,返回操作系统 } *5.设计一个时间类Time,要求: (1)包含时(hour)、分(minute)和秒(second)私有数据成员。 (2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。 3.4实验提示 1.在重载下标运算符时,已将关于下标pos的操作重载成elem[pos-1],因此obj[1],obj[2],…,依次对应于elem[0],elem[1],…。 2.复数相加的结果也应为复数,所以[1]应填Complex,程序中b表示和,应为返回值,所以[2]应填写b,参考答案为: [1]Complex[2]b 3.在定义整型对象b时,没有提供初始值,可使用无参数的构造函数,也可使用带参数的构造函数的缺省参数值0来构造整型对象,这样便产生了二义性,可去掉无参数的构造函数(去掉第14行),或去掉带参数的构造函数中的缺省值(去掉第15行中的“=0”)。 4.由于各C++编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编序更方便,可增加一些成员函数,比如: voidSetYear(inty);}//设置年 intSetMonth(intm);//设置月 intSetDay(intd);//设置日 intGetYear()const;//返回年 intGetMonth()const;//返回月 intGetDay()const;//返回日 staticintIsLeapyear(inty);//判断年份y是否为润年 staticintGetDays(inty);//年份y的天数 staticintGetDays(constDate&d);//日期d当前月份的天数 staticintDateToNum(constDate&d);//返回从公元1年1月1日起的天数 staticDateNumToDate(intn);//由从公元1年1月1日起的天数返回日期 润年条件: 年份能被4整除,并且年份不能被100整除,或者年份能被400整除 润年天数: 366 平年天数: 365 润年2月份天数: 29 平年2月份天数: 28 5.可仿照第4题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。 时间转换成秒数: 秒数=时*3600+分*60+秒 秒数转换成时间: 时=秒数/3600 分=(秒数-时*3600)/60 秒=秒数%60 为编序更方便,可增加一些成员函数,比如: voidSetHour(inthh);//设置小时 voidSetMinute(intmm);//设置分钟 voidSetSecond(intss);//设置秒 intGetHour()const;//返回小时 intGetMinute()const;//返回分钟 intGetSecond()const;//返回秒 3.5实验步骤 以实验内容第4题为例说明实验步骤。 具体实现步骤如下: 1.建立工程exp4_4。 2.建立源程序文件main.cpp,具体内容如下: //文件名: main.cpp #include usingnamespacestd;//使用标准命名空间std //日期类 classDate { private: //数据成员: intyear;//年 intmonth;//月 intday;//日 public: //公有函数: Date(inty=1,intm=1,intd=1): year(y),month(m),day(d){}//构造函数 voidSetYear(inty){year=y;}//设置年 voidSetMonth(intm){month=m;}//设置月 voidSetDay(intd){day=d;}//设置日 intGetYear()const{returnyear;}//返回年 intGetMonth()const{returnmonth;}//返回月 intGetDay()const{returnday;}//返回日 Dateoperator+(intdays);//返回当前日期加上天数后得到的日期 Dateoperator-(intdays);//返回当前日期减去天数后得到的日期 staticboolIsLeapyear(inty);//判断年份y是否为润年 staticintGetYearDays(inty);//年份y的天数 staticintGetMonthDays(constDate&d);//日期d当前月份的天数 staticintDateToNum(constDate&d);//返回从公元1年1月1日起的天数 staticDateNumToDate(intn);//由从公元1年1月1日起的天数返回日期 }; ostream&operator<<(ostream&out,constDate&d);//重载输出运算符 istream&operator>>(istream&in,Date&d);//重载输入运算符>> //日期类及相关函数的实现部分 DateDate: : operator+(intdays)//返回当前日期加上天数后得到的日期 { intn=DateToNum(*this)+days;//从公元1年1月1日起的天数 returnNumToDate(n);//返回日期 } DateDate: : operator-(intdays)//返回当前日期减去天数后得到的日期 { intn=DateToNum(*this)-days;//从公元1年1月1日起的天数 returnNumToDate(n);//返回日期 } boolDate: : IsLeapyear(inty)//判断年份y是否为润年 { if(y%4==0&&y%100! =0||y%400==0)returntrue;//润年 elsereturnfalse;//平年 } intDate: : GetYearDays(inty)//年份y的天数 { if(IsLeapyear(y))return366;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)