资源描述
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; 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 题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();
展开阅读全文