C重载习题.docx
《C重载习题.docx》由会员分享,可在线阅读,更多相关《C重载习题.docx(9页珍藏版)》请在冰豆网上搜索。
C重载习题
C++重载习题
01.分析以下程序执行结果
#include
intadd(intx,inty)
{
returnx+y;
}
doubleadd(doublex,doubley)
{
returnx+y;
}
voidmain()
{
inta=4,b=6;
doublec=2.6,d=7.4;
cout<}
解:
本题说明函数重载的使用方法,这里有两个add()函数,一个add()函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的。
所以输出为:
10,10
-----------------------------------------------
02.分析以下程序的执行结果
#include
classSample
{
inti;
doubled;
public:
voidsetdata(intn){i=n;}
voidsetdata(doublex){d=x;}
voiddisp()
{
cout<<"i="<
}
};
voidmain()
{
Samples;
s.setdata(10);
s.setdata(15.6);
s.disp();
}
解:
本题说明重载成员函数的使用方法。
setdata()成员函数有两个,根据其参数类型加以区分。
所以输出为:
i=10,d=15.6
-----------------------------------------------
03.分析以下程序的执行结果
#include
classSample
{
intn;
public:
Sample(){}
Sample(inti){n=i;}
Sample&operator=(Sample);
voiddisp(){cout<<"n="<};
Sample&Sample:
:
operator=(Samples)
{
Sample:
:
n=s.n;
return*this;
}
voidmain()
{
Samples1(10),s2;
s2=s1;
s2.disp();
}
解:
本题说明重载运算符(=)的使用方法。
operator=成员函数实现两个对象的赋值。
所以输出为:
n=10
-------------------------------------------------
04.设计一个点类Point,实现点对象之间的各种运算。
解:
Point类提供了6个运算符重载函数(参加程序中的代码和注释),以实现相应的运算。
本题程序如下:
#include
classPoint
{
intx,y;
public:
Point(){x=y=0;}
Point(inti,intj){x=i;y=j;}
Point(Point&);
~Point(){}
voidoffset(int,int);//提供对点的偏移
voidoffset(Point);//重载,偏移量用Point类对象表示
booloperator==(Point);//运算符重载,判断两个对象是否相同
booloperator!
=(Point);//运算符重载,判断两个对象是否不相同
voidoperator+=(Point);//运算符重载,将两个点对象相加
voidoperator-=(Point);//运算符重载,将两个点对象相减
Pointoperator+(Point);//运算符重载,相加并将结果放在左操作数中
Pointoperator-(Point);//运算符重载,相减并将结果放在左操作数中
intgetx(){returnx;}
intgety(){returny;}
voiddisp()
{
cout<<"("<}
};
Point:
:
Point(Point&p)
{
x=p.x;y=p.y;
}
voidPoint:
:
offset(inti,intj)
{
x+=i;y+=j;
}
voidPoint:
:
offset(Pointp)
{
x+=p.getx();y+=p.gety();
}
boolPoint:
:
operator==(Pointp)
{
if(x==p.getx()&&y==p.gety())
return1;
else
return0;
}
boolPoint:
:
operator!
=(Pointp)
{
if(x!
=p.getx()||y!
=p.gety())
return1;
else
return0;
}
voidPoint:
:
operator+=(Pointp)
{
x+=p.getx();y+=p.gety();
}
voidPoint:
:
operator-=(Pointp)
{
x-=p.getx();y-=p.gety();
}
PointPoint:
:
operator+(Pointp)
{
this->x+=p.x;this->y+=p.y;
return*this;
}
05.设计一个日期类Date,包括年、月、日等私有数据成员。
要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。
解:
在Date类中设计如下重载运算符函数:
Dateoperator+(intdays);返回一日期加一天数得到的日期
Dateoperator-(intdays);返回一日期减去天数得到的日期
intoperator-(Date&b);返回两日期相差的天数
在实现这些重载运算符函数调用以下私有成员函数:
leap(int);判断指定的年份是否为闰年
dton(Date&);将指定日期转换为从0年0月0日起的天数
ntod(int);将指定的0年0月0日起的天数转换为对应的日期
本题程序如下:
#include
intday_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二维数组存放各月天数,第一行对应非闰年,第二行对应闰年
classDate
{
intyear,month,day;
intleap(int);
intdton(Date&);
Datentod(int);
public:
Date(){}
Date(inty,intm,intd)
{
year=y;month=m;day=d;
}
voidsetday(intd){day=d;}
voidsetmonth(intm){month=m;}
voidsetyear(inty){year=y;}
intgetday(){returnday;}
intgetmonth(){returnmonth;}
intgetyear(){returnyear;}
Dateoperator+(intdays)
{
staticDatedate;
intnumber=dton(*this)+days;
date=ntod(number);
returndate;
}
Dateoperator-(intdays)
{
staticDatedate;
intnumber=dton(*this);
number-=days;
date=ntod(number);
returndate;
}
intoperator-(Date&b)
{
intdays=dton(*this)-dton(b)-1;
returndays;
}
voiddisp()
{
cout<}
};
intDate:
:
leap(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)//是闰年
return1;
else//不是闰年
return0;
}
intDate:
:
dton(Date&d)
{
inty,m,days=0;
for(y=1;y<=d.year;y++)
if(leap(y))
days+=366;
else
days+=365;
for(m=0;mif(leap(d.year))
days+=day_tab[1][m];
else
days+=day_tab[0][m];
days+=d.day;
returndays;
}
DateDate:
:
ntod(intn)
{
inty=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;
returnDate(y,m,d);
}
voidmain()
{
Datenow(2002,6,12),then(2003,2,10);
cout<<"now:
";now.disp();
cout<<"then:
";then.disp();
cout<<"相差天数:
"<<(then-now)<Dated1=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
题6.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。
解:
在Triangle类中设计一个友元函数operator+(Trianglet1,Trianglet2),它重载运算符"+",返回t1和t2两个三角形的面积之和。
本题程序如下:
#include
#include
classTriangle
{
intx,y,z;
doublearea;
public:
Triangle(inti,intj,intk)
{
doubles;
x=i;y=j;z=k;
s=(x+y+z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
voiddisparea()
{
cout<<"Area="<
}
frienddoubleoperator+(Trianglet1,Trianglet2)
{
returnt1.area+t2.area;
}
};
voidmain()
{
Trianglet1(3,4,5),t2(4,5,6);
doubles;
cout<<"t1:
";t1.disparea();
cout<<"t2:
";t2.disparea();
s=t1+t2;
cout<<"总面积="<
}
本程序执行结果如下:
t1:
Area=6
t2:
Area=9.92157
总面积=15.9216
-----------------------------------------------------------
题7.习题6的重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。
解:
习题6的重载运算符为什么不能计算3个三角形的面积之和呢?
对于式子:
s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可。
本题程序如下:
#include
#include
classTriangle
{
intx,y,z;
doublearea;
public:
Triangle(inti,intj,intk)
{
doubles;
x=i;y=j;z=k;
s=(x+y+z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
voiddisparea()
{
cout<<"Area="<
}
frienddoubleoperator+(Trianglet1,Trianglet2)
{
returnt1.area+t2.area;
}
frienddoubleoperator+(doubled,Trianglet)
{
returnd+t.area;
}
};
voidmain()
{
Trianglet1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);
doubles;
cout<<"t1:
";t1.disparea();
cout<<"t2:
";t2.disparea();
cout<<"t3:
";t3.disparea();
cout<<"t4:
";t4.disparea();
s=t1+t2+t3+t4;
cout<<"总面积="<
}
本程序的执行结果如下:
t1:
Area=6
t2:
Area=9.92157
t3:
Area=14.6969
t4:
Area=20.3332
总面积=50.9517
-------------------------------------------------------
题8.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。
解:
#include
#include
#include
classstudent
{
charname[10];
intdeg1,deg2,deg3;
public:
student(){}
student(charna[],intd1,intd2,intd3)
{
strcpy(name,na);
deg1=d1;deg2=d2;deg3=d3;
}
friendstudentoperator+(students1,students2)
{
staticstudentst;
st.deg1=s1.deg1+s2.deg1;
st.deg2=s1.deg2+s2.deg2;
st.deg3=s1.deg3+s2.deg3;
returnst;
}
voiddisp()
{
cout<}
friendvoidavg(student&s,intn)
{
cout<}
};
voidmain()
{
students1("Li",78,82,86),s2("Zheng",75,62,89);
students3("Ma",89,87,95),s4("Xu",54,78,66),s;
cout<<"输出结果"<s1.disp();
s2.disp();