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