函数重载习题与解析.doc_第1页
函数重载习题与解析.doc_第2页
函数重载习题与解析.doc_第3页
函数重载习题与解析.doc_第4页
函数重载习题与解析.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

函数重载+习题与解析-重载时间:2010-05-19 12:13:47 来源:第二电脑网作者:第二电脑网第二电脑网导读:tadd(a,b),add(c,d)endl; 解: 本题说明函数重载的使用方法, 这里有两个add()函数,一个add()函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的。 所以输出为: 10,10 - 02.分析以下程序的执行结果 #includeiostrea. 正文:01.分析以下程序执行结果 #include int add(int x,int y) return x+y; double add(double x,double y) return x+y; void main() int a=4,b=6; double c=2.6,d=7.4; coutadd(a,b),add(c,d)endl; 解: 本题说明函数重载的使用方法, 这里有两个add()函数,一个add()函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的。 所以输出为: 10,10 - 02.分析以下程序的执行结果 #include class Sample int i; double d; public: void setdata(int n)i=n; void setdata(double x)d=x; void disp() couti=i,d=dendl; ; void main() Sample s; s.setdata(10); s.setdata(15.6); s.disp(); 解: 本题说明重载成员函数的使用方法。setdata()成员函数有两个,根据其参数类型加以区分。 所以输出为:i=10, d=15.6 - 03.分析以下程序的执行结果 #include class Sample int n; public: Sample() Sample(int i)n=i; Sample &operator =(Sample); void disp()coutn=nendl; ; Sample &Sample:operator=(Sample s) Sample:n=s.n; return *this; void main() Sample s1(10),s2; s2=s1; s2.disp(); 解: 本题说明重载运算符(=)的使用方法。operator=成员函数实现两个对象的赋值。 所以输出为: n=10 - 04.设计一个点类Point,实现点对象之间的各种运算。 解: Point类提供了6个运算符重载函数(参加程序中的代码和注释),以实现相应的运算。 本题程序如下: #include class Point int x,y; public: Point()x=y=0; Point(int i,int j)x=i;y=j; Point(Point &); Point() void offset(int,int); / 提供对点的偏移 void offset(Point); / 重载,偏移量用Point类对象表示 bool operator=(Point); / 运算符重载,判断两个对象是否相同 bool operator!=(Point); / 运算符重载,判断两个对象是否不相同 void operator+=(Point); / 运算符重载,将两个点对象相加 void operator-=(Point); / 运算符重载,将两个点对象相减 Point operator+(Point ); / 运 算符重 载,相加并将结果放在左操作数中 Point operator-(Point); / 运算符重载,相减并将结果放在左操作数中 int getx()return x; int gety()return y; void disp() cout(x,y)x+=p.x; this-y+=p.y; return *this; Point Point:operator-(Point p) this-x-=p.x;this-y-=p.y; return *this; void main() Point p1(2,3),p2(3,4),p3(p2); cout1:; p3.disp(); p3.offset(10,10); cout2:; p3.disp(); cout3:(p2=p3)endl; cout4:(p2!=p3)endl; p3+=p1; cout5:; p3.disp(); p3-=p2; cout6:; p3.disp(); p3=p1+p3; / 先将p1+p3的结果放在p1中,然后赋给p3,所以p1=p3 cout7:; p3.disp(); p3=p1-p2; cout8:; p3.disp(); 本程序的执行结果如下: 来源:/master/College/Language/VC/2010-05-19/14206第二电脑网导读:tadd(a,b),add(c,d)endl; 解: 本题说明函数重载的使用方法, 这里有两个add()函数,一个add()函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的。 所以输出为: 10,10 - 02.分析以下程序的执行结果 #includeiostrea. 正文:1:(3,4) 2:(13,14) 3:0 4:1 5:(15,17) 6:(12,13) 7:(14,16) 8:(11,12) - 05.设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基础运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。 解: 在Date类中设计如下重载运算符函数: Date operator+(int days); 返回一日期加一天数得到的日期 Date operator-(int days); 返回一日期减去天数得到的日期 int operator-(Date &b); 返回两日期相差的天数 在实现这些重载运算符函数调用以下私有成员函数: leap(int); 判断指定的年份是否为闰年 dton(Date &); 将指定日期转换为从0年0月0日起的天数 ntod(int); 将指定的0年0月0日起的天数转换为对应的日期 本题程序如下: #include int day_tab212=31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,31,30,31,30,31; / day_tab 二维数组存放各月天数,第一行对应非闰年,第二行对应闰年 class Date int year,month,day; int leap(int); int dton(Date &); Date ntod(int); public: Date() Date(int y,int m,int d) year=y;month=m;day=d; void setday(int d)day=d; void setmonth(int m)month=m; void setyear(int y)year=y; int getday()return day; int getmonth()return month; int getyear()return year; Date operator+(int days) static Date date; int number=dton(*this)+days; date=ntod(number); return date; Date operator-(int days) static Date date; int number=dton(*this); number-=days; date=ntod(number); return date; int operator-(Date &b) int days=dton(*this)-dton(b)-1; return days; void disp() coutyear.month.dayendl; ; int Date:leap(int year) if(year%4=0&year%100!=0|year%400=0) / 是闰年 return 1; else / 不是闰年 return 0; int Date:dton(Date &d) int y,m,days=0; for(y=1;y=d.year;y+) if(leap(y) days+=366; else days+=365; for(m=0;md.month-1;m+) if(leap(d.year) days+=day_tab1m; else days+=day_tab0m; days+=d.day; return days; Date Date:ntod(int n) int y=1,m=1,d,rest=n,lp; while(1) if(leap(y) if(rest=366) break; else rest-=366; else if(restday_tab1m-1) rest-=day_tab1m-1; else break; else if(restday_tab0m-1) rest-=day_tab0m-1; else break; m+; d=rest; return Date(y,m,d); void main() Date now(2002,6,12),then(2003,2,10); coutnow:; now.disp(); coutthen:; then.disp(); cout相差天数:(then-now)endl; Date d1=now+100,d2=now-100; coutnow+100:; d1.disp(); coutnow-100:; d2.disp(); 本程序的执行结果如下: now:2002.6.12 then:2003.2.10 相差天数:242 now+100:2002.9.20 now-100:2002.3.4 题1.分析以下程序的执行结果 #include int add(int x,int y) return x+y; int add(int x,int y,int z) return x+y+z; void main() int a=4,b=6,c=10; coutadd(a,b),add(a,b,c)endl; 解: 本题说明重载函数的使用方法。这里有两个add()函数,一个的参数是2个,另一个的参数是3个,它们是根据参数个数自动区分的。 所以输出为:10,20 - 题2.分析以下程序的执行结果 #include class Sample int i; double d; public: void setdata(int n)i=n;d=0; void setdata(int n,double x)正文: i=n;d=x; void disp() couti=i,d=dendl; ; void main() Sample s; s.setdata(10); s.disp(); s.setdata(2,15.6); s.disp(); 解: 本题说明重载函数的使用方法。setdata()成员函数有2个,根据其参数个数自动加以区分。 所以输出为: i=10,d=0 i=2,d=15.6 - 题3.分析以下程序的执行结果 #include class Sample int n; public: Sample() Sample(int i)n=i; friend Sample operator-(Sample &,Sample &); friend Sample operator+(Sample &,Sample &); void disp()coutn=nendl; ; Sample operator-(Sample &s1,Sample &s2) int m=s1.n-s2.n; return Sample(m); Sample operator+(Sample &s1,Sample &s2) int m=s1.n+s2.n; return Sample(m); void main() Sample s1(10),s2(20),s3; s3=s2-s1; s3.disp(); s3=s2+s1; s3.disp(); 解: 本题说明重载运算符-和+的使用。operator-和operator+两个友元函数实现两个对象的减法和加法。所以输出为: n=10 / s2-s1 n=30 / s2+s1 - 题4.分析以下程序的执行结果 #include class Sample int A1010; public: int &operator()(int,int); ; int &Sample:operator()(int x,int y) return Axy; void main() Sample a; int i,j; for(i=0;i10;i+) for(j=0;j10;j+) a(i,j)=i+j; for(i=0;i10;i+) couta(i,1) ; coutendl; 解: 本题说明重载下标运算符的使用方法。通过重载下标运算符,使得对于对象a,有a(i,j)等于a.Aij。 所以输出为: 1 2 3 4 5 6 7 8 9 10 - 题5.分析以下程序的执行结果 #include class Sample int n; public: Sample(int i)n=i; operator+()n+; / 前缀重载运算符 operator+(int)n+=2; / 后缀重载运算符 void disp() coutn=nendl; ; void main() Sample A(2),B(2); A+; /调用后缀重载运算符 +B; / 调用前缀重载运算符 A.disp(); B.disp(); 解: 本题说明重载运算符+的使用方法。operator+()为前缀重载运算符,operator+(int)为后缀重载运算符。A+的语句调用后缀重载运算符,+B语句调用前缀重载运算符。 所以输出为: n=4 n=3 题6.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。 解: 在Triangle类中设计一个友元函数operator+(Triangle t1,Triangle t2),它重载运算符+,返回t1和t2两个三角形的面积之和。 本题程序如下: #include #include class Triangle int x,y,z; double area; public: Triangle(int i,int j,int k) double s; x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() coutArea=areaendl; friend double operator+(Triangle t1,Triangle t2) return t1.area+t2.area; ; void main() Triangle t1(3,4,5),t2(4,5,6); double s; coutt1:; t1.disparea(); coutt2:; t2.disparea(); s=t1+t2; cout总面积=sendl; 本程序执行结果如下: t1:Area=6 t2:Area=9.92157 总面积=15.9216 - 题7.习题6的重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。 解: 习题6的重载运算符为什么不能计算3个三角形的面积之和呢?对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可。 正文:本题程序如下: #include #include class Triangle int x,y,z; double area; public: Triangle(int i,int j,int k) double s; x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() coutArea=areaendl; friend double operator+(Triangle t1,Triangle t2) return t1.area+t2.area; friend double operator+(double d,Triangle t) return d+t.area; ; void main() Triangle t1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8); double s; coutt1:; t1.disparea(); coutt2:; t2.disparea(); coutt3:; t3.disparea(); coutt4:; t4.disparea(); s=t1+t2+t3+t4; cout总面积=sendl; 本程序的执行结果如下: t1:Area=6 t2:Area=9.92157 t3:Area=14.6969 t4:Area=20.3332 总面积=50.9517 - 题8.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。 解: #include #include #include class student char name10; int deg1,deg2,deg3; public: student() student(char na,int d1,int d2,int d3) strcpy(name,na); deg1=d1;deg2=d2;deg3=d3; friend student operator+(student s1,student s2) static student st; st.deg1=s1.deg1+s2.deg1; st.deg2=s1.deg2+s2.deg2; st.deg3=s1.deg3+s2.deg3; return st; void disp() coutsetw(10)namesetw(5)deg1setw(5)deg2setw(5)deg3endl; friend void avg(student &s,int n) coutsetw(10)平均分setw(5)s.deg1/nsetw(5)s.deg2/nsetw(5)s.deg3/nendl; ; void main() student s1(Li,78,82,86),s2(Zheng,75,62,89); student s3(Ma,89,87,95),s4(Xu,54,78,66),s; cout输出结果endl; s1.disp(); s2.disp(); s3.disp(); s4.disp(); s=s1+s2+s3+s4; / 调用重载运算符 avg(s,4); / 友元函数求平均分 本程序的执行结果如下: 输出结果: Li 78 82 86 Zheng 75 62 89 Ma 89 87 95 Xu 54 78 66 平均分 74 77 84 - 题9.在Time类中设计如下重载运算符函数: Time operator+(Time); 返回一时间加上另一时间得到的新时间 Time operator-(Time); 返回一时间减去另一时间得到的新时间 本题程序如下: #include class Time int hour,minute,second; public: Time() Time(int h,int m,int s) hour=h;minute=m;second=s; Time(int h,int m) hour=h;minute=m;second=0; void sethour(int h)hour=h; void setminute(int m)minute=m; void setsecond(in

温馨提示

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

评论

0/150

提交评论