01.分析以下程序执行结果 #include<iostream.h> 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; cout<<add(a,b)<<","<<add(c,d)<<endl; } 解: 本题说明函数重载的使用方法, 这里有两个add()函数,一个add()函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的。 所以输出为: 10,10
-----------------------------------------------
02.分析以下程序的执行结果 #include<iostream.h> class Sample { int i; double d; public: void setdata(int n){i=n;} void setdata(double x){d=x;} void disp() { cout<<"i="<<i<<",d="<<d<<endl; } }; void main() { Sample s; s.setdata(10); s.setdata(15.6); s.disp(); } 解: 本题说明重载成员函数的使用方法。setdata()成员函数有两个,根据其参数类型加以区分。 所以输出为:i=10, d=15.6
-----------------------------------------------
03.分析以下程序的执行结果 #include<iostream.h> class Sample { int n; public: Sample(){} Sample(int i){n=i;} Sample &operator =(Sample); void disp(){cout<<"n="<<n<<endl;} }; 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<iostream.h> 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<<")"<<endl; } }; Point::Point(Point &p) { x=p.x; y=p.y; } void Point::offset(int i,int j) { x+=i; y+=j; } void Point::offset(Point p) { x+=p.getx(); y+=p.gety(); } bool Point::operator==(Point p) { if(x==p.getx()&&y==p.gety()) return 1; else return 0; } bool Point::operator!=(Point p) { if(x!=p.getx()y!=p.gety()) return 1; else return 0; } void Point::operator+=(Point p) { x+=p.getx(); y+=p.gety(); } void Point::operator-=(Point p) { x-=p.getx(); y-=p.gety(); } Point Point::operator+(Point p) { this->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); cout<<"1:"; p3.disp(); p3.offset(10,10); cout<<"2:"; p3.disp(); cout<<"3:"<<(p2==p3)<<endl; cout<<"4:"<<(p2!=p3)<<endl; p3+=p1; cout<<"5:"; p3.disp(); p3-=p2; cout<<"6:"; p3.disp(); p3=p1+p3; // 先将p1+p3的结果放在p1中,然后赋给p3,所以p1=p3 cout<<"7:"; p3.disp(); p3=p1-p2; cout<<"8:"; p3.disp(); }
本程序的执行结果如下: 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<iostream.h> int day_tab[2][12]={{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() { cout<<year<<"."<<month<<"."<<day<<endl; } }; int Date::leap(int year) { if(year%4==0&&year%100!=0year%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;m<d.month-1;m++) if(leap(d.year)) days+=day_tab[1][m]; else days+=day_tab[0][m]; 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(rest<=365) break; else rest-=365; } y++; } y--; lp=leap(y); while(1) { if(lp) { if(rest>day_tab[1][m-1]) rest-=day_tab[1][m-1]; else break; } else { if(rest>day_tab[0][m-1]) rest-=day_tab[0][m-1]; else break; } m++; } d=rest; return Date(y,m,d); } void main() { Date now(2002,6,12),then(2003,2,10); cout<<"now:"; now.disp(); cout<<"then:"; then.disp(); cout<<"相差天数:"<<(then-now)<<endl; Date d1=now+100,d2=now-100; cout<<"now+100:"; d1.disp(); cout<<"now-100:"; d2.disp(); }
本程序的执行结果如下: now:2002.6.12 then:2003.2.10 相差天数:242 now+100:2002.9.20 now-100:2002.3.4
题1.分析以下程序的执行结果 #include<iostream.h> 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; cout<<add(a,b)<<","<<add(a,b,c)<<endl; } 解: 本题说明重载函数的使用方法。这里有两个add()函数,一个的参数是2个,另一个的参数是3个,它们是根据参数个数自动区分的。 所以输出为: 10,20
-------------------------------------------------
题2.分析以下程序的执行结果 #include<iostream.h> 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() { cout<<"i="<<i<<",d="<<d<<endl; } }; 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<iostream.h> class Sample { int n; public: Sample(){} Sample(int i){n=i;} friend Sample operator-(Sample &,Sample &); friend Sample operator+(Sample &,Sample &); void disp(){cout<<"n="<<n<<endl;} }; 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<iostream.h> class Sample { int A[10][10]; public: int &operator()(int,int); }; int &Sample::operator()(int x,int y) { return A[x][y]; } void main() { Sample a; int i,j; for(i=0;i<10;i++) for(j=0;j<10;j++) a(i,j)=i+j; for(i=0;i<10;i++) cout<<a(i,1)<<" "; cout<<endl; } 解: 本题说明重载下标运算符的使用方法。通过重载下标运算符,使得对于对象a,有a(i,j)等于a.A[i][j]。 所以输出为: 1 2 3 4 5 6 7 8 9 10
------------------------------------------------
题5.分析以下程序的执行结果 #include<iostream.h> class Sample { int n; public: Sample(int i){n=i;} operator++(){n++;} // 前缀重载运算符 operator++(int){n+=2;} // 后缀重载运算符 void disp() { cout<<"n="<<n<<endl; } }; 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<iostream.h> #include<math.h> 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() { cout<<"Area="<<area<<endl; } 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; cout<<"t1:"; t1.disparea(); cout<<"t2:"; t2.disparea(); s=t1+t2; cout<<"总面积="<<s<<endl; } 本程序执行结果如下: t1:Area=6 t2:Area=9.92157 总面积=15.9216
-----------------------------------------------------------
题7.习题6的重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。 解: 习题6的重载运算符为什么不能计算3个三角形的面积之和呢?对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可。 本题程序如下: #include<iostream.h> #include<math.h> 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() { cout<<"Area="<<area<<endl; } 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; cout<<"t1:"; t1.disparea(); cout<<"t2:"; t2.disparea(); cout<<"t3:"; t3.disparea(); cout<<"t4:"; t4.disparea(); s=t1+t2+t3+t4; cout<<"总面积="<<s<<endl; } 本程序的执行结果如下: t1:Area=6 t2:Area=9.92157 t3:Area=14.6969 t4:Area=20.3332 总面积=50.9517
-------------------------------------------------------
题8.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。 解: #include<iostream.h> #include<iomanip.h> #include<string.h> class student { char name[10]; 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() { cout<<setw(10)<<name<<setw(5)<<deg1<<setw(5)<<deg2<<setw(5)<<deg3<<endl; } friend void avg(student &s,int n) { cout<<setw(10)<<"平均分"<<setw(5)<<s.deg1/n<<setw(5)<<s.deg2/n<<setw(5)<<s.deg3/n<<endl; } }; 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<iostream.h> 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(int s){second=s;} int gethour(){return hour;} int getminute(){return minute;} int getsecond(){return second;} Time operator+(Time); Time operator-(Time); void disp() { cout<<hour<<":"<<minute<<":"<<second<<endl; } }; Time Time::operator+(Time t) { int carry,hh,mm,ss; ss=getsecond()+t.getsecond(); if(ss>60) { ss-=60; carry=1; // 进位标记 } else carry=0; mm=getminute()+t.getminute()+carry; if(mm>60) { mm-=60; carry=1; } else carry=0; hh=gethour()+t.gethour()+carry; if(hh>24) hh=24; static Time result(hh,mm,ss); return result; } Time Time::operator-(Time t) { int borrow,hh,mm,ss; ss=getsecond()-t.getsecond(); if(ss<0) { ss+=60; borrow=1; // 借位标记 } else borrow=1; mm=getminute()-t.getminute()-borrow; if(mm<0) { mm+=60; borrow=1; } else borrow=0; hh=gethour()-t.gethour()-borrow; if(hh<0) hh+=24; static Time result(hh,mm,ss); return result; } void main() { Time now(2,24,39); Time start(17,55); Time t1=now-start,t2=now+start; cout<<"输出结果:"<<endl; cout<<" now: "; now.disp(); cout<<" start:"; start.disp(); cout<<" 相差: "; t1.disp(); cout<<" 相加: "; t2.disp(); } 本程序的执行结果如下: 输出结果: now:2:24:39 start:17:55:0 相差:8:28:39 相加:20:19:39
|