運算符重載練習題_第1頁
運算符重載練習題_第2頁
運算符重載練習題_第3頁
運算符重載練習題_第4頁
運算符重載練習題_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、運算符重載.單項選擇題1 .下列運算符中,運算符在C+4不能重載。A.?:B.+C.D.<=2 .下列運算符中,運算符在C+中不能重載。A.&&B.C.:D.new3 .下列關于運算符重載的描述中,是正確的。A.運算符重載可以改變操作數(shù)的個數(shù)B.運算符重載可以改變優(yōu)先級C.運算符重載可以改變結合性D.運算符重載不可以改變語法結構4 .友元運算符objl>obj2被C+編譯器解釋為。A.operator>(objl,obj2)B.>(obj1,obj2)C.obj2.operator:>(obj1)D.objl.operator>(obj2)5

2、 .現(xiàn)需要對list類對象使用的邏輯運算符“二=”重載,以下函數(shù)聲明是正確的。A、list&list:operator=(constlist&a);B、listlist:operator=(constlist&a);C、bool&list:operator=(constlist&a);D、boollist:operator=(constlist&a);6 .以下類中分別說明了“+=”和“+”運算符重載函數(shù)的原型。如果主函數(shù)中有定義:funm,c,d;,那么,執(zhí)行語句c=m+;時,編譯器把m+解釋為:A)c.operator+(m);B)m=ope

3、rator+(m);C)m.operator+(m);D)operator+(m);classfunpublic:funoperator+=(fun);friendfunoperator+(fun&,int);7 .在第6題中,當執(zhí)行語句d+=m;時,C+編譯器對語句作如下解釋:A.d=operator+=(m);B.m=operator+=(d);C.d.operator+=(m);D.m.operator+=(d);8 .設有以下類定義,其中說明了“+”運算符重載函數(shù)的原型。這是一個友元函數(shù),當類外有語句a=b+c;訪問這個友元函數(shù)時,C+編譯器把對語句a=b+c;解釋為:oper

4、ator+(b,c)其中:A.a,b,c都必須是Com的對象B.a,b都必須是Com的對象C.a,c都必須是Com的對象D.b,c都必須是Com的對象classCom.friendComoperator+();.填空題1. 利用成員函數(shù)對雙目運算符重載,其左操作數(shù)為,右操作數(shù)為。2. 運算符重載仍然保持其原來的優(yōu)先級、和。3. 為了滿足運算符“+”的可交換性,必須將其重載為。例如,有以下程序:#include<iostream.h>classSampleintn;public:Sample()Sample(inti)n=i;friendSampleoperator+(Sample,

5、Sample);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<<&qu

6、ot;s3:"s3.disp();程序執(zhí)行結果如下:從中看到,執(zhí)行sl+s2和s2+sl的結果是相同的,從而滿足運算符“+”的交換性。4 .在C+中,運算符的重載有兩種實現(xiàn)方法,一種是通過成員函數(shù)來實現(xiàn),另一種則通過(4)來實現(xiàn)。5 .當用成員函數(shù)重載雙目運算符時,運算符的左操作數(shù)必定是:三.程序分析題1.以下程序的執(zhí)行結果是。#include<iostream.h>classSampleintn;public:Sample()Sample(intm)n=m;)int&operator-(int)n-;returnn;voiddisp()cout<<&

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

8、endl;obj.disp();3.閱讀下面的程序,在空白處填寫出程序運行后的結果。#include<iostream.h>classcomplexfloatreal,imag,publiccomplex(float rfloati)real=r;imag=i;complex()real=Oimag=O ; void print()friend complex operator+(complex acomplex b) ;friend complex operatorfriend complex operatorfriend complex operatorvoid complex

9、 : : print()cout<<real :if(imag>O)cout<< ” +” ;if(imag! : 0) cout<<imag<<complex operator+(complex acomplex temp ;temp real=a real+b temp imag=a imag+breturn temp ;complex operator-(complex acomplex temp ;temp real=a real-b temp imag=a imag-b return temp ;complex operator

10、*(complex a一 (complex a , complex b); (complex a , complex b) ; (complex a , complex b) ;i ” <<endl ;complex b)real ; imag;, complex b)real ; imag;, complex b)complex temp ;temp real : a real*btemp imag=a real *breal-a imag *b imag ; imag+a imag *b real ;returntempcomplex operator(complexa,com

11、plexb)complextempfloattttt=l(brealbreal+bimag。bimag);tempreal=(areal*breal+aimag*bimag)*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

12、. 3+4.6i3. 6+2.8i(2)解:(1)、(2)、(3)和(4)分別是2.3+4.6i和3.6+2.8i兩個復數(shù)相加、相減、相乘和相除的結果。本題答案為:(1)5.9+7.4i(2)-1.3+1.8i-4.6+23i;(4)A.1.01731+0.486538i。四.簡答題1 說明以下類date的功能,并給出程序執(zhí)行結果。#include<iostreamh>staticintdys=31,28,31,30,31,30,31,31,30,31,30,31);c1assdateintmo,rda,ryr;public:date(intm,intd,inty)mo=m;da=

13、d;yr=y;date()voiddisp()cout<<mo<<”<<da<<“”<<yr<<endl;frienddateoperator+(date&d,intday)/運算符重載友元函數(shù)datedt;dtmo=dmo;dtyr=dyr;day+=dda;while(day>dysdtmo-1)day-=dysdtmo-1;if(+dtmo=13)dtmo=1;dtyr+;dtda=day;returndt;voidmain()datedl(2,10,2003),d2;d2=dl+365;d2disp(

14、);解:類date含有mo、da和),r3個私有數(shù)據(jù)成員,分別存放一個日期的月份、日號和年份。其成員函數(shù)有:兩個構造函數(shù),disp0成員函數(shù)用于顯示日期,“+”運算符重載為計算指定日期加上指定天數(shù)后的日期。本程序輸出2003年2月10日加上365天后的日期,結果為:2102004。2 說明以下類Words的功能,并給出程序執(zhí)行結果。#include<iostreamh>#include<stringh>classWordschar*strpublic:Words(char*s)str=newcharstrlen(s)+1;strcpy(str,s);voiddisp()

15、cout<<str<<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=”Hello”;Wordsword(s);worddisp();for(i=0;i<strlen(s);

16、i+)cout<<wordi;cout<<endl:解:Words類含有一個私有數(shù)據(jù),其成員函數(shù)有:一個構造函數(shù),disp()函數(shù)用于輸出str,下標運算符重載函數(shù)用于將指定下標的字母大小寫互換,其他字符時不變。本程序的輸出結果如下:Hell()heLL()3 有以下兩個程序,分析它們的執(zhí)行結果有什么不同。程序l:#include<iostreamh>classPointintx,y;public:Point()x=y=0;Point(inti,intj)x=i;y=j;Pointoperator+(Point);voiddisp()(cout<<

17、;”(”<<x<<”,”<<y<<”)”<<endl;)PointPoint:operator+(PointP)this->x+=Px;this->y+=py;return*this;voidmain()Pointpl(2,3),p2(3,4),p3;cout<<”pl:”;p1disp();cout<<”p2:”;p2disp();p3=pl+p2;cout<<”執(zhí)行p3=pl+p2后”<<endl;cout<<”pl:”,p1disp();cout<&l

18、t;”p2:”;p2disp();cout<<”p3:”;p3disp();程序2:#include<i0Streamh>classPointintx,Y;public:Point()x=y=O;Point(inti,intj)x=i,y=j;Pointoperator+(Point);voiddispf)cout<<”(”<<x<<”,”<<y<<”)”<<endl;PointPoint:operator+(PointP)Points;sx=x+px;sy=y+py;returns;voidmai

19、n()Pointpl(2,3),p2(3,4),p3;cout<<”pl:”;p1disp();cout<<”p2:”;p2disp();p3=pl+p2;cout<<”執(zhí)行p3=pl+p2后”<<endl;cout<<”pl:”;p1disp();cout<<”p2:”;p2disp();cout<<”p3:”;p3disp();解:這兩個程序中的main函數(shù)完全相同,類Point中的運算符重載均采用成員函數(shù)方式實現(xiàn),只是程序l的運算符重載函數(shù)使用this指針,而程序2的運算符重載函數(shù)使用局部對象。p3=pl

20、+p2等價于p3=p1operator+(p2)。對于程序l,this指針指向p1對象,執(zhí)行this->x+=px;this->y十一py;語句,修改pl對象的x和y成員值,執(zhí)行return*this;語句,將pl對象賦給p3。所以pl和p3兩個對象的x、Y值相同,即p3=pl+p2等價于p1=p1+p2,p3:pl,其運行結果如下:pl:(2,3)p2:(3,4)執(zhí)行p3=pl+p2后P1:(5,7)p2:(3,4)P3:(5,7)對于程序2,執(zhí)行運算符重載函數(shù),Points;語句定義一個對象,sx=x+px;sy=y+py;語句用于修改s對象的x、Y值,retills;語句返回

21、該對象,賦給p3,而pl和p2對象不改變。其運行結果如下:pl:(2,3)p2:(3,4)執(zhí)行p3=pl+p2后pl:(2,3)p2:(3,4)p3:(5,7)五.完善程序題1.本程序調用構造函數(shù)實現(xiàn)字符串對象的初始化。調用重載運算符"+"把兩個字符串拼接,并通過重載運算符“>”來實現(xiàn)字符串的比較運算。#include<iostream.h>#include<string.h>classstringchar*str;public:string(char*s=0)if(_(14)str=newcharstrlen(s)+1;strcpy(_(15

22、)_);elsestr=0;friendstringoperator+(string&,string&);intoperator>(string&);voidshow()if(str)cout<<str<<'n'stringoperator+(string&s1,string&s2)stringt;t.str=(16);strcat(t.str,s2.str);(17);intstring:operator>(string&s)if(strcmp(18)>0)return1;elseret

23、urn0;voidmain(void)strings1("southeastuniversity"),s2("mechanicaldepartment");strings3;s3=s1+s2;s1.show();s2.show();s3.show();cout<<(s1>s2)<<'n'答案:(14)s(15)str,s(16)s1.str(17)returnt(18)str,s.str六上機題(一)改錯題(二)編程題1 定義一個計數(shù)器類 Counter ,對其重載運算符“解:計數(shù)器類 Counter 含有一

24、個私有整型數(shù)據(jù)成員值增 l 。程序如下:+” 。n,+”運算符重載為使對象的 n#include<iostream class Counter h>int npublic :Counter()n=OCounter(int i)n=i /Counter operator+(Counter c) /默認構造函數(shù)構造函數(shù)運算符重載函數(shù)Counter temp ; temp n=n+c return temp ;n;void disp() void main()Counter cl(5)c3=c1+c2;cout<<c2(10)c3;c1c2c3disp() disp() di

25、sp()n=” <<rl<<endl ; 2 C+在運行期間不會自動檢查數(shù)組是否越界。設計一個類能夠檢查數(shù)組是否越界。解:設計一個類Words,下標運算符重載為:判斷指定的下標是否越界,越界時顯示相應的錯誤信息,未越界時返回該下標的字符。程序如下:#include<iostreamh>#incude<string class Words int len char *strh>/ str/所指字符串的長度 字符串指針public : Words(char *s)/構造函數(shù)str=new charstrlen(s)+1strcpy(str len=s

26、trlen(s)s) ;charoperator(intn)if(n>len-1)cout<<”數(shù)組下標越界”;return;/返回一個特殊字符elsereturn*(str+n);voiddisp()cout<<str<<endl;voidmain()Wordsword(”Goodbye”);worddisp();cout<<”位置0:”;cout<<word0<<endl;/顯示Gcout<<”位置15:”;cout<<word15<<endl;/越界3 設計一個日期類Date

27、,包括年、月、日等私有數(shù)據(jù)成員。要求實現(xiàn)日期的基本運算,如某日期加上天數(shù)、某日期減去天數(shù)、兩日期相差的天數(shù)等。解:在Date類中設計如下重載運算符函數(shù):Dateoperator+(intdays):返回某日期加上天數(shù)得到的日期Dateoperator(intdays):返回某日期減去天數(shù)得到的日期intoperator-(Date&b):返回兩日期相差的天數(shù)在實現(xiàn)這些重載運算符函數(shù)時調用以下私有成員函數(shù):leap(int):判斷指定的年份是否為閏年dton(Date&):將指定日期轉換成從0年O月O日起的天數(shù).ntod(int)程序如下::將指定的0年。月。日起的天數(shù)轉換成對應

28、的日期#include<iostreamh>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二維數(shù)組存放各月天數(shù),第一行對應非閏年,第二行對應閏年classDateintyear,month,day;/年,月,日intleap(int);/判斷是否為閏年intdton(Date&);Datentod(int);publicDate()Date(intY,intm,intd)year=y;month=m;day=d;voidsetday

29、(intd)day=dvoidsetmonth(intm)month=mvoidsetyear(inty)year=yintgetday()returndayintgetmonth()returnmonthintgetyear()returnyearDateoperator+(intdays)/+staticDatedate;intnumber=dton(*this)+daysdate=ntod(number);returndate;Dateoperator-(intdays)/StaticDatedate;intnumber=dton(*this)number-=days;date=ntod

30、(number);returndate;intoperator-(data&b)/intdays=dton(*this)-dton(b)-1returndaysvoiddisp()/輸出日期cout<<year<<;運算符重載函數(shù)”<<month<<”一運算符重載函數(shù)一運算符重載函數(shù)<<day<<endl:intDate:leap(intyear)if(year4=0&&year100!=0|year400=0)/是閏年return1;else/不是閏年return0;intDate:dton(Da

31、te)&d)/求從公元0年0月0日到d日期的天數(shù)inty,m,days=0;for(y=1;y<=dyear;y+)if(1eap(y)days+=366;/閏年時加366天elsedays+=365;/非閏年時加365天for(m=0;m<dmonth-1;m+)if(leap(dyear)days+=day_tab1m;elsedays+=day_tab0m;days+=dday;returndays;DateDate:ntod(intn)/將從公元0年0月0日的天數(shù)轉換成日期inty=l;m=l;d,rest=n,lp;while(1)if(leap(y)/閏年if(

32、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_tab1m-i;elsebreak;else/非閏年if(rest>day_tab0m-1)rest-=day_tab0m-1;elsebreak;m+:d=rest;returnDate(y,m,d);voidmein()Datenow(2003,10,1),then(2005,6,5);cout&l

33、t;<”now:”;nowdisp();cout<<”then:”;thendisp();cout<<”相差天數(shù):”<<(thennow)<<endl;Datedl=now+1000,d2=now-i000;cout<<”now+1000:”;dldisp();cout<<”now1000:”;d2disp();4本程序的執(zhí)行結果如下:now:2003101then:200565相差天數(shù):612now+1000:2006627now一1000:2001114定義如下集合類的成員函數(shù),并用數(shù)據(jù)進行測試。classSet

34、int*elem;/intcount;/public:Set();Set(ints,intn)intfind(intx)constSetoperator+(constSetSetoperator-(constSetSetoperator*(constSetvoiddisp();/存放集合元素的指針存放集合中的元素個數(shù);/判斷X是否在集合中);/集合的并集);/集合的差集);/集合的交集輸出集合元素:該類的運算符重載均采用成員函數(shù)方式實現(xiàn)。程序如下:#include<iostreamh>constintN=100;/集合中最多元素個數(shù)classSetint*elem;/intcoun

35、t;/public:Set();Set(intS,intn)intfind(intx)constSetoperator+(constSetSetoperator-(constSetSetoperator*(constSet存放集合元素的指針存放集合中的元素個數(shù)/判斷X是否在集合中);/集合的并集);/集合的差集);/集合的交集voiddisp();/輸出集合元素Set:Set()/默認構造函數(shù)elem=NULL;count=O;Set:Set(ints,intn)/初始化構造函數(shù)intielem=newintnfor(i=0;i<n;i+)*(elem+i)=si;count=n;int

36、Set:find(intx)constinti;for(i=O;i<count;i+)if(*(elem+i)=x)return1;return0;SetSet:operator+(constset&s)intaN,i,k;先將當前集合元素放入 a 數(shù)組中for(i=0;i<count;i+)/ai=elemik=count ;for(i=0 ; i<s count ; i+)/將集合s中不在當前集合中的元素放入a數(shù)組中if(find(selemI)continue;elseif(k=N-1)break;ak+=selemireturnSet(a,k);/調用構造函數(shù)

37、產生一個無名對象返回SetSet:intaNfor(i=0operator-(constSet,i,k=0;i<count;i+)/if(!sreturnSet(afind(elemi)ak+=elemi,k);/SetSet:operator*(constSet&s)intaNfor(i=0if(s,k=0,i;i<count;i+)/find(elemi)s)/調用構造函數(shù)產生一個無名對象返回集合的差集將當前集合中不在s集合中的元素放入a數(shù)組中/掃描當前集合中所有元素集合的交集ak+=elemi;/將屬于兩個集合的元素放在a數(shù)組中returnSet(a,k);/調用構造函數(shù)產生一個無名對象返回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:”;s1disp();cout<<”集合s2:”;s2disp();S3=s1+S2;cout<<”并集:”;s3disp();S3=s1*S2;cout<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論