C重载习题.docx

上传人:b****6 文档编号:7732458 上传时间:2023-01-26 格式:DOCX 页数:9 大小:17.41KB
下载 相关 举报
C重载习题.docx_第1页
第1页 / 共9页
C重载习题.docx_第2页
第2页 / 共9页
C重载习题.docx_第3页
第3页 / 共9页
C重载习题.docx_第4页
第4页 / 共9页
C重载习题.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

C重载习题.docx

《C重载习题.docx》由会员分享,可在线阅读,更多相关《C重载习题.docx(9页珍藏版)》请在冰豆网上搜索。

C重载习题.docx

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;m

if(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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1