运算符重载练习题1概要_第1页
运算符重载练习题1概要_第2页
运算符重载练习题1概要_第3页
运算符重载练习题1概要_第4页
运算符重载练习题1概要_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运算符重载.单项选择题1 .下列运算符中,运算符在C+用不能重载。A.?:B.+C.D.<=2 .下列运算符中,运算符在C+中不能重载。A.&&B.C.:D.new3 .下列关于运算符重载的描述中,是正确的。A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构4 .友元运算符objl>obj2被C+编译器解释为。A.operator>(objl,obj2)B.>(obj1,obj2)C.obj2.operator:>(obj1)D.objl.operator>(obj2)5

2、 .现需要对list类对象使用的逻辑运算符“=”重载,以下函数声明是正确的。A、list&list:operator=(constlist&a);B、listlist:operator=(constlist&a);C、bool&list:operator=(constlist&a);D、boollist:operator=(constlist&a);6 .以下类中分别说明了“+=”和“+”运算符重载函数的原型。如果主函数中有定义:funm,c,d;,那么,执行语句c=m+;时,编译器把m+解释为:A)c.operator+(m);B)m=oper

3、ator+(m);C)m.operator+(m);D)operator+(m);classfunpublic:funoperator+=(fun);friendfunoperator+(fun&,int);7 .在第6题中,当执行语句d+=m;时,C+编译器对语句作如下解释:A.d=operator+=(m);B.m=operator+=(d);C.d.operator+=(m);D.m.operator+=(d);8 .设有以下类定义,其中说明了“+”运算符重载函数的原型。这是一个友元函数,当类外有语句a=b+c;访问这个友元函数时,C+编译器把对语句a=b+c;解释为:opera

4、tor+(b,c)其中:A.a,b,c都必须是Com的对象B.a,b都必须是Com的对象C.a,c都必须是Com的对象D.b,c都必须是Com的对象classCom.friendComoperator+();.填空题1.利用成员函数对双目运算符重载,其左操作数为,右操作数为2. 运算符重载仍然保持其原来的优先级、和。3. 为了满足运算符“+”的可交换性,必须将其重载为。例如,有以下程序:#include<iostream.h>classSampleintn;public:Sample()Sample(inti)n=i;friendSampleoperator+(Sample,Sam

5、ple);voiddisp()cout<<"n="<<n<<endl;Sampleoperator+(samples1,Samples2)returnsample(S1.n+s2.n);voidmain()SampleS1(2),s2(5),s3;cout<<"S1:";S1.disp();cout<<"s2:"s2.disp();s3=S1+S2;cout<<"s3:"s3.disp();S3=S2+S1;cout<<"

6、s3:"s3.disp();程序执行结果如下:从中看到,执行sl+s2和s2+sl的结果是相同的,从而满足运算符“+”的交换性。4 .在c+中,运算符的重载有两种实现方法,一种是通过成员函数来实现,另一种则通过(4)来实现。5 .当用成员函数重载双目运算符时,运算符的左操作数必定是:三.程序分析题1.以下程序的执行结果是。#include<iostream.h>classSample(intn;public:Sample()Sample(intm)n=m;)int&operator-(int)n-;returnn;voiddisp()cout<<&qu

7、ot;n="<<n<<endl;)voidmain()Samples(10);(S-)+;S.disp();2.以下程序的执行结果是:#include<iostream.h>classSampleprivate:intx;public:Sample()x=0;voiddisp()cout<<"x="<<x<<endl;void0perator+()x+=10;voidmain()Sampleobj;obj.disp();obj+;cout<<“执行。bj+之后”<<en

8、dl;obj.disp();3.阅读下面的程序,在空白处填写出程序运行后的结果。#include<iostream.h>classcomplexfloatreal,imag,publiccomplex(floatrcomplex()real=Ovoidprint(),floati)real=r;imag=O;friendcomplexoperator+(complexacomplexb);friendcomplexoperatorfriendcomplexoperatorfriendcomplexoperator(complexa(complexa/(complexa,comple

9、xb);complexb);complexb);voidcomplex:print()cout<<realif(imag>O)cout<<"+";if(imag!:0)cout<<imag<<"i"<<endl;complexoperator+(complexa,complexb)complextemp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;returntemp;complexoperator-(complexa,complexb)

10、complextemp;temp.real=a.real-b.real;temp.imag=a.imag-b.imag;returntemp;complexoperator*(complexa,complexb)complextemp;temp.real:a.real*b.real-a.imag*b.imag;temp.imag=a.real*b.imag+a.imag*b.real;returntemp;complexoperator/(complexa,complexb)complextemp;floattt;tt=l/(b.real'b.real+b.imag。b.imag);t

11、emp.real=(a.real*b.real+a.imag*b.imag)*tt;temp.imag=(b.real*a.imag-a.real*b.imag)*tt;returntemp;)voidmain()(complexc1(2.3,4.6),c2(3.6,2.8),c3;cl.print();c2.print();c3=c1+c2;c3.print();c3=c1-c2;c3.print();c3=c1*c2;c3.print();c3=c1/c2;c3.print();)程序运行结果为:2. 3+4.6i3. 6+2.8i(2)解:(1)、(2)、(3)和(4)分别是2.3+4.

12、6i和3.6+2.8i两个复数相加、相减、相乘和相除的结果。本题答案为:(1)5.9+7.4i(2)-1.3+1.8i-4.6+23i;(4)A.1.01731+0.486538i。四.简答题1. 说明以下类date的功能,并给出程序执行结果。#include<iostream.h>staticintdys=31,28,31,30,31,30,31,31,30,31,30,31);c1assdateintmo,rda,ryr;public:date(intm,intd,inty)mo=m;da=d;yr=y;date()voiddisp()cout<<mo<<

13、;"/"<<da<<"/”<<yr<<endl;frienddateoperator+(date&d,intday)/运算符重载友元函数datedt;dt.mo=d.modt.yr=d.yr;day+=d.da;while(day>dysdt.mo-1)day-=dysdt.mo-1;if(+dt.mo=13)dt.mo=1;dt.yr+;dt.da=day;returndt;voidmain()datedl(2,10,2003),d2;d2=dl+365;d2.disp();解:类date含有m。da

14、和),r3个私有数据成员,分别存放一个日期的月份、日号和年份。其成员函数有:两个构造函数,disp0成员函数用于显示日期,“+”运算符重载为计算指定日期加上指定天数后的日期。本程序输出2003年2月10日加上365天后的日期,结果为:2/10/2004。2. 说明以下类Words的功能,并给出程序执行结果。#include<iostreamh>#include<stringh>classWordschar*strpublicWords(char*s)(str=newcharstrlen(s)+1;strcpy(str,s);voiddisp()cout<<s

15、tr<<endl;charoperator(inti)if(stri>='A&&stri<='Z')/大写字母returnchar(stri+32);elseif(stri>='a'&&stri<='z')/4'写字母returnchar(stri-32);else/其他字符returnstri;voidmain()inti;char*s="HelloWordsword(s);word.disp();for(i=0;i<strlen(s);i+)c

16、out<<wordi;cout<<endl解:Words类含有一个私有数据,其成员函数有:一个构造函数,disp()函数用于输出str,下标运算符重载函数用于将指定下标的字母大小写互换,其他字符时不变。本程序的输出结果如下:Hell()heLL()3. 有以下两个程序,分析它们的执行结果有什么不同。程序l:#include<iostream.h>classPointintx,y;publicPoint()x=y=0;Point(inti,intj)x=i;y=j;Pointoperator+(Point)voiddisp()(cout<<&quo

17、t;("<<x<<","<<y<<")”<<endl;)PointPoint:operator+(PointP)(this->x+=P.x;this->y+=p.y;return*this;)voidmain()(Pointpl(2,3),p2(3,4),p3;cout<<"pl:"p1.disp();cout<<"p2:"p2.disp();p3=pl+p2;cout<<"执行p3=pl+p2后”

18、<<endl;cout<<“pl:",p1.disp();cout<<"p2:”;p2.disp();cout<<“p3:";p3.disp();)程序2:#include<i0Stream.h>classPointintx,Y;public:Point()x=y=O;Point(inti,intj)x=i,y=j;Pointoperator+(Point);voiddispf)cout<<"("<<x<<"J<<y<&l

19、t;")”<<endl;PointPoint:operator+(PointP)Points;s.x=x+p.x;s.y=y+p.y;returns;voidmain()Pointpl(2,3),p2(3,4),p3;cout<<"pl:"p1.disp()cout<<“p2:"p2.disp()p3=pl+p2;cout<<“执行p3=pl+p2后”<<endl;cout<<"pl:"p1.disp();cout<<“p2:"p2.disp

20、();cout<<"p3:"p3.disp();)解:这两个程序中的main函数完全相同,类Point中的运算符重载均采用成员函数方式实现,只是程序l的运算符重载函数使用this指针,而程序2的运算符重载函数使用局部对象。p3=pl+p2等价于p3=p1.operator+(p2)。对于程序l,this指针指向pl对象,执行this->x+=p.x;this->yH-p.y;语句,修改pl对象的x和y成员值,执行return*this;语句,将pl对象赋给p3。所以p1和p3两个对象的x、Y值相同,即p3=pl+p2等价于p1=p1+p2,p3:pl

21、,其运行结果如下:pl:(2,3)p2:(3,4)执行p3=pl+p2后P1:(5,7)p2:(3,4)P3:(5,7)对于程序2,执行运算符重载函数,Points;语句定义一个对象,s.x=x+p.x;s.y=y+p.y;语句用于修改s对象的x、Y值,ret%ills;语句返回该对象,赋给p3,而pl和p2对象不改变。其运行结果如下:pl:(2,3)p2:(3,4)执行p3=pl+p2后pl:(2,3)p2:(3,4)p3:(5,7)五.完善程序题1,本程序调用构造函数实现字符串对象的初始化。调用重载运算符"+"把两个字符串拼接,并通过重载运算符“>”来实现字符串的

22、比较运算。#include<iostream.h>#include<string.h>classstringchar*str;public:string(char*s=0)if(_(14)str=newcharstrlen(s)+1;strcpy(_(15)_);elsestr=0;friendstringoperator+(string&,string&);intoperator>(string&);voidshow()if(str)cout<<str<<'n'stringoperator+(str

23、ing&s1,string&s2)stringt;t.str=(16)strcat(t.str,s2.str);(17);intstring:operator>(string&s)if(strcmp(18)>0)return1;elsereturn0;voidmain(void)strings1("southeastuniversity"),s2("mechanicaldepartment");strings3;s3=s1+s2;s1.show();s2.show();s3.show();cout<<(s1

24、>s2)<<'n'答案:(14)s(15)str,s(16)s1.str(17)returnt(18)str,s.str六.上机题(一)改错题(二)编程题+”。n,“+”运算符重载为使对象的n1. 定义一个计数器类Counter,对其重载运算符“解:计数器类Counter含有一个私有整型数据成员值增l。程序如下:#include<iostreamclassCounterintnpublicCounter()n=OCounter(inti)n=iCounteroperator+(Counterc)/默认构造函数构造函数运算符重载函数Countertemp;

25、temp.n=n+c.returntemp;n;voiddisp()voidmain()Countercl(5)c3=c1+c2;cout<<,c2(10),c3;clc2c3.disp().disp()disp()n="<<rl<<endl;2. C+在运行期间不会自动检查数组是否越界。设计一个类能够检查数组是否越界。解:设计一个类Words,下标运算符重载为:判断指定的下标是否越界,越界时显示相应的错误信息,未越界时返回该下标的字符。程序如下:#include<iostream.h>#incude<stringclassWor

26、dsintlenchar*strh>/str/所指字符串的长度字符串指针/构造函数public:Words(char*s)str=newcharstrlen(s)+1strcpy(strlen=strlen(s)charoperator(intn)(if(n>len-1)(cout<<”数组下标越界”;return;/返回一个特殊字符)elsereturn*(str+n);)voiddisp()cout<<str<<endl;)voidmain()Wordsword("Goodbye");word.disp();cout<

27、;<"位置0:"cout<<word0<<endl;/显示'G'cout<<“位置15:"cout<<word15<<endl;/越界3. 设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。解:在Date类中设计如下重载运算符函数:Dateoperator+(intdays):返回某日期加上天数得到的日期Dateoperator(intdays):返回某日期减去天数得到的日期 intoperator-(

28、Date&b):返回两日期相差的天数在实现这些重载运算符函数时调用以下私有成员函数: leap(int):判断指定的年份是否为闰年 dton(Date&):将指定日期转换成从0年。月。日起的天数.ntod(int):将指定的0年。月。日起的天数转换成对应的日期程序如下:#include<iostream.h>intday_tab212=31,28,31,30,3l,30,3l,3l,30,31,30,31),31,29,31,30,31,30,31,31,30,31,30,31;/day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年classDate

29、intyear,month,day;/年,月,日intleap(int);/判断是否为闰年intdton(Date&);Datentod(int);publicDate()Date(intY,intmvoidsetday(intd)day=dvoidsetmonth(intm)month=mvoidsetyear(inty)year=yintgetday()returndayintgetmonth()returnmonthintgetyear()returnyearDateoperator+(intdays)/+staticDatedate;intnumber=dton(*this)+

30、daysdate=ntod(number);returndate;Dateoperator-(intdays)/StaticDatedate;intnumber=dton(*this);number-=days;date=ntod(number);returndateintoperator-(data&b)/intdays=dton(*this)-dton(b)-1returndaysvoiddisp()/输出日期cout<<year<<"<<month<<”.intd)year=y;;month=mday=d;运算符重载函数一

31、运算符重载函数一运算符重载函数<<day<<endl:intDate:leap(intyear)if(year%4=0&&year%100!=0|year%400=0)是闰年return1;else/不是闰年return0;intDate:dton(Date)&d)/求从公元0年0月0日至1Jd日期的天数inty,m,days=0;for(y=1;y<=d.year;y+)if(1eap(y)days+=366;/闰年时加366天elsedays+=365;/非闰年时力口365天for(m=0;m<dmonth-1;m+)if(lea

32、p(d.year)days+=day_tab1m;elsedays+=day_tab0m;days+=d.day;returndays;DateDate:ntod(intn)/将从公元0年0月0日的天数转换成日期inty=l;m=l;d,rest=n,lp;while(1)if(leap(y)/闰年if(rest<=366)break;elserest-=366;else/IP闰年if(rest<=365)break;elserest-=365;y+y-ip=leap(y);while(1)if(ip)/闰年if(rest>day;tab1m-1)rest-=day_tab1

33、m-i;elsebreakelse/非闰年if(rest>day_tab0m-1)rest-=day_tab0m-1;elsebreakm+七d=rest;returnDate(y,md);voidmein()Datenow(2003,10,1),then(2005,6,5);cout<<"now:"now.disp();cout<<"then:";then.disp();cout<<“相差天数:"<<(thennow)<<endl;Datedl=now+1000,d2=now-

34、i000;cout<<"now+1000:”;dl.disp();cout<<"now1000:”;d2.disp();本程序的执行结果如下:now:2003.10.1then:2005.6.5相差天数:612now+1000:2006.6.27now-1000:2001.1.144.定义如下集合类的成员函数,并用数据进行测试。classSetint*elemintcount/存放集合元素的指针存放集合中的元素个数public:Set(),intn)Set(intsintfind(intx)constSetoperator+(constSetSeto

35、perator-(constSetSetoperator*(constSet/&);););判断X是否在集合中/集合的并集/集合的差集/集合的交集voiddisp();/输出集合元素解:该类的运算符重载均采用成员函数方式实现。程序如下:#include<iostreamh>constintN=100/集合中最多元素个数classSetint*elem/intcount/存放集合元素的指针存放集合中的元素个数intn)public:Set()Set(intS口/intfind(intx)constSetoperator+(constSetSetoperator-(constS

36、etSetoperator*(constSet判断X是否在集合中/集合的并集/集合的差集/集合的交集voiddisp()Set:Set()/elem=NULL;count=O;/输出集合元素默认构造函数intn)/初始化构造函数Set:Set(intsintielem=newintn;for(i=0;i<n;i+)*(elem+i)=si;count=n;)intSet:find(intx)const(intifor(i=O;i<count;i+)if(*(elem+i)=x)return1;return0;)SetSet:operator+(constset&s)(int

37、aN,i,k;for(i=0;i<count;i+)/ai=elemi;k=count;for(i=0;i<s.count;i+)/if(find(s.elemI)continueelse(if(k=N-1)break;ak+=s.elemi;)returnSet(a,k);)SetSet:operator-(constSet(intaN,i,k=0;for(i=0;i<count;i+)/if(!s.find(elemi)ak+=elemi;returnSet(a,k);)SetSet:operator*(constSet&s)/(先将当前集合元素放入a数组中将集合

38、s中不在当前集合中的元素放入a数组中调用构造函数产生一个无名对象返回&s)/集合的差集将当前集合中不在s集合中的元素放入a数组中调用构造函数产生一个无名对象返回集合的交集intaN,k=0,i;for(i=0;i<count;i+)/if(s.find(elemi)扫描当前集合中所有元素ak+=elemireturnSet(a,k);/将属于两个集合的元素放在a数组中调用构造函数产生一个无名对象返回)voidSet:disp()/输出集合元素(inti;for(i=0;i<count;i+)cout<<*(elem+i)<<"";cout<<endl)voidmain()(inta=1,4,2,7,8;intb=2,3,1,6,7,;Sets1(a,5),s2(b,5),s3;cout<<"集合S1:”;s1.disp();cout<<”集合s2:”;s2.disp();S3=s1+S2;cout<<"并集:”;s3.disp();S3=s1*S2;cout<&l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论