工科習(xí)題答案13_第1頁(yè)
工科習(xí)題答案13_第2頁(yè)
工科習(xí)題答案13_第3頁(yè)
工科習(xí)題答案13_第4頁(yè)
工科習(xí)題答案13_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、習(xí)題 13一、簡(jiǎn)答題1什么是運(yùn)算符重載?實(shí)現(xiàn)運(yùn)算符重載有幾種方法?如何實(shí)現(xiàn)?:C+提供的運(yùn)算符重載機(jī)制能夠?qū)崿F(xiàn)將已有運(yùn)算符應(yīng)用到新的數(shù)據(jù)類型變量上,賦予運(yùn)算符新的含義。C+對(duì)運(yùn)算符重載有一些限制,見 13.2.1 節(jié)。有兩種方法可以實(shí)現(xiàn)運(yùn)算符重載,它們是:類的成員函數(shù)方式和有函數(shù)方式。定義的目的是在函數(shù)中直接類的私有成員。實(shí)際上,可以通過(guò)類的公有函數(shù)接口類的私有成員,所以實(shí)現(xiàn)運(yùn)算符重載,可以使用非成員、非實(shí)現(xiàn)運(yùn)算符的重載。但是這種實(shí)現(xiàn)方法增加了13.2.2 節(jié)。私有數(shù)據(jù)成員的公有函數(shù)的調(diào)用時(shí)間,不值得提倡。見2如何實(shí)現(xiàn)本類對(duì)象與其它類對(duì)象之間的相互類型轉(zhuǎn)換?:可以使用“類型轉(zhuǎn)換函數(shù)”將本類對(duì)象

2、轉(zhuǎn)換成其他類對(duì)象。而“類型轉(zhuǎn)換函數(shù)”本質(zhì)上就是運(yùn)算符的重載。另外,可以使用“構(gòu)造函數(shù)”將其他類對(duì)象轉(zhuǎn)換成本類對(duì)象。3什么是虛函數(shù)?什么是純虛函數(shù)?它們的作用是什么?:多態(tài)性是面象程序設(shè)計(jì)的重要特性,它與前面講的封裝性和繼承性面象程序設(shè)計(jì)的三大特性。這三大特性是互相關(guān)聯(lián)的,封裝性是基礎(chǔ),繼承性是關(guān)鍵,而多態(tài)性是補(bǔ)充。多態(tài)分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。函數(shù)重載和運(yùn)算符重載屬于靜態(tài)多態(tài)。動(dòng)態(tài)多態(tài)是運(yùn)行時(shí)的多態(tài),如某些函數(shù)的調(diào)用關(guān)系在運(yùn)行階段才能確定。為了實(shí)現(xiàn)函數(shù)調(diào)用關(guān)系的動(dòng)態(tài)多態(tài),可以將函數(shù)定義成虛函數(shù)。將一個(gè)成員函數(shù)定義成虛函數(shù)的方法是,在函數(shù)定義的返回值類型前加 virtual。在抽象類中,有時(shí)無(wú)法實(shí)

3、現(xiàn)某定義成純虛函數(shù)。能(即無(wú)法決定某一函數(shù)的具體實(shí)現(xiàn)),只能將函數(shù)虛函數(shù)具有函數(shù)實(shí)現(xiàn)的函數(shù)體,而純虛函數(shù)沒有函數(shù)體,即沒有函數(shù)實(shí)現(xiàn)。對(duì)純虛函數(shù),只能在其派生類中實(shí)現(xiàn)該函數(shù)的功能。4試比較虛函數(shù)與虛基類的概念及作用。:虛函數(shù)用于實(shí)現(xiàn)動(dòng)態(tài)多態(tài)。而虛基類用于實(shí)現(xiàn)在多重繼承情況下,基類數(shù)據(jù)成員在派生類中保留一個(gè)副本,見 12.6 節(jié)。二、選擇題:1. C2. D3. A4. D5. B6. C7. D8. C三、運(yùn)行結(jié)果、完善程序1運(yùn)行結(jié)果:n=4 n=32, 32:先看虛線框中的程序,運(yùn)行結(jié)果為: D:show( ) called. 8 若將 A 行的 virtual 去掉,則結(jié)果為: B:show

4、( ) called. 5 對(duì)本題,若將虛線框中的 fun( )和 main( )函數(shù)同時(shí)修改成右側(cè)實(shí)線框中的對(duì)應(yīng)函數(shù),則若 A行有 virtural 時(shí),結(jié)果為: D:show( ) called. 8; 若 A 行無(wú)virtual 時(shí),結(jié)果為: B:show( ) called. 5 。3運(yùn)行結(jié)果為:The B verBThe D1 info: 4 ver The D2 info: 100 verThe D3 info: -25 ver1B3去掉 A 行的 virtual,則運(yùn)行結(jié)果為:The B ver The B ver The B verThe B verB 1 B34:operat

5、or char *( )return s;(3)str = num;四、編程題1:/ 實(shí)現(xiàn) 1,賦值運(yùn)算符重(=和+=)載函數(shù)的返回值為對(duì)象的/ 缺點(diǎn):不可實(shí)現(xiàn)對(duì)象的連續(xù)賦值,只能 c1= c2 #includeclass Complexfloat Real, Image; public:Complex(float r=0,float i=0)Real=r;Image=i;void show( )。cout(Real,Image)n;void operator=(Complex &);/用成員實(shí)現(xiàn),注意:=不能元實(shí)現(xiàn)void operator+=(Complex &);/用成員實(shí)現(xiàn),+=可以元

6、實(shí)現(xiàn)元實(shí)現(xiàn)元實(shí)現(xiàn)friend Complex operator+(Complexfriend Complex operator-(Complexplex &); /plex &); /;void Complex: operator=(Complex &c)Real=c.Real; Image=c.Image;/返回值 voidvoid Complex: operator+=(Complex &c) /返回值Real=Real+c.Real; Image=Image+c.Image;Complex operator+(Complex &c1, Complex &c2)Complex t; t.R

7、eal=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; return t;Complex operator-(Complex &c1, Complex &c2)Complex t; t.Real=c1.Real-c2.Real;t.Image=c1.Image-c2.Image; return t;void main( )Complex c1(1,2),c2(3,4),c3;voidc3=c1; c3=c1+c2; c3+=c2;c3=c1-c2;c3.show( );c3.show( );c3.show( );c3.show( );/ 實(shí)現(xiàn) 2,賦值運(yùn)

8、算符重(=和+=)載函數(shù)的返回值為對(duì)象的/ 優(yōu)點(diǎn):可實(shí)現(xiàn)對(duì)象的連續(xù)賦值,如 c1=c2=c3 #include。class Complexfloat Real, Image; public:Complex(float r=0,float i=0)Real=r;Image=i;void show( )cout(Real,Image)n;Complex & operator=(Complex &); Complex & operator+=(Complex &); friend Complex operator+(Complexfriend Complex operator-(Complex/用成

9、員實(shí)現(xiàn),注意:=不能元實(shí)現(xiàn)/用成員實(shí)現(xiàn),+=可以元實(shí)現(xiàn)plex &); /plex &); /元實(shí)現(xiàn)元實(shí)現(xiàn);Complex & Complex: operator=(Complex &c)/返回值為對(duì)象的Real=c.Real; Image=c.Image; return *this;Complex & Complex: operator+=(Complex &c) /返回值為對(duì)象的Real=Real+c.Real; Image=Image+c.Image; return *this;Complex operator+(Complex &c1, Complex &c2)Complex t; t

10、.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; return t;Complex operator-(Complex &c1, Complex &c2)Complex t; t.Real=c1.Real-c2.Real;t.Image=c1.Image-c2.Image; return t;void main( )Complex c1(1,2),c2(3,4),c3;c3=c2=c1; c3=c1+c2; c3+=c2;c3=c1-c2;c3.show( );c3.show( );c3.show( );c3.show( );2:#includ

11、e #include classFractionm, n; / m 是分子,npublic:是分母Fraction(im=0,in=1)t=(im,in);m=im/t;n=;if(m*n0)/ 若分子和分母同號(hào) m=abs(m); n=abs(n); else/ 若分子和分母異號(hào) m=-abs(m); n=abs(n); ;(x,y);Fraction & operator= ( Fraction b )m=b.m; n=b.n; return *this;Fraction operator+ ( Fraction b )return Fraction(m*b.n+n*b.m,n*b.n);

12、 Fraction operator- ( Fraction b )return Fraction(m*b.n-n*b.m,n*b.n);friend Fraction operator* ( Fraction a, Fraction b ); friend Fraction operator/ ( Fraction a, Fraction b ); void Show() coutm/nendl; ;Fraction:(x,y ) /返回的最大公約數(shù)是正數(shù)r;if(x0) x= -x;if(y0) y= -y; while( r=x%y )x=y;y=r;returny;Fraction o

13、perator* ( Fraction a, Fraction b )return Fraction(a.m*b.m, a.n*b.n);Fraction operator/ ( Fraction a, Fraction b )return Fraction(a.m*b.n, a.n*b.m);voidmain( )Fractiona(1,3),b(3,-12),c; couta=; a.Show( );coutb=; b.Show( ); c=a+b;couta+b=; c.Show(); c=a-b;couta-b=; c.Show(); c=a*b;couta*b=; c.Show();

14、 c=a/b;couta/b=; c.Show();3: #include class Pofloat x,y; public:Po(float a=0,float b=0)x=a;y=b;void show( )Po Pocoutx=xty=yn;& operator+( ); /用成員函數(shù)實(shí)現(xiàn)前置,返回operator+(); /用成員函數(shù)實(shí)現(xiàn)后置,返回對(duì)象friend Pofriend Po& operator-(Pooperator-(Po&);& ,);/元函數(shù)實(shí)現(xiàn)前置,返回元函數(shù)實(shí)現(xiàn)后置,返回對(duì)象/ 前置或后置,一般應(yīng)返回對(duì)象或/ 既 a+ 合法,而 b=a+;,否則只能單獨(dú)使用P

15、o& Po:operator+( )/前置,成員實(shí)現(xiàn)x+;y+;return *this;PoPo:operator+()/后置,成員實(shí)現(xiàn)Pot=*this;x+;y+;return t;Po& operator-(Po&p)/前置,實(shí)現(xiàn)p.x-; p.y-;return p;Pooperator-(Po&p,)/后置,實(shí)現(xiàn)Potemp=p;p.x-;p.y-;return temp;void main( )Pom(1,2), c;c=m+;/ 如果只寫c.show( );m.show( ); c=+m; c.show( );m.show( );c=m-;c.show( );m.show( )

16、;c=-m;c.show( );m.show( );m+; m.show( );則無(wú)法測(cè)出是前置還是后置4: #include #include class stringchar *str; len;public:string(char *s=0)/構(gòu)造函數(shù),含缺省構(gòu)造函數(shù)if(s)/此處必須判斷 s 是否為空指針。len=strlen(s); /若 s 為空指針,則 strlen(s)報(bào)運(yùn)行錯(cuò)。 str=new charlen+1;strcpy(str,s);elselen=0,str=0;/注意逗號(hào)string(string &st) /拷貝構(gòu)造函數(shù),必須要定義,想if(st.str)le

17、n=st.len;str=new charlen+1; strcpy(str,st.str);elselen=0,str=0;string( ) /析構(gòu)函數(shù)if(str)delete str;void set(char *s) /置值if(str)delete str; /必須先刪除原空間if(s)len=strlen(s);str=new charstrlen(s)+1; strcpy(str,s);為什么?elsestr=0,len=0;void show(void) /顯示串if(str)coutstrendl;elsecoutThe string is empty!endl;getle

18、n(void) /獲取長(zhǎng)度return len;/解 1void delchar(char ch) /刪除字符(刪除所有參數(shù)指定的字符)i, j;for(i=j=0; stri; i+)if( stri!=ch ) strj+=stri; strj=0;char *t=str;/使字符串長(zhǎng)度與成員 len 的值保持一致str=new charstrlen(t)+1; strcpy(str,t); len=strlen(str);delete t;/* 解 2void delchar(char ch) /刪除字符(刪除所有參數(shù)指定的字符)i=0;if(str)/while(ilen)while(

19、stri)/刪除若干字符后,len 與 str 指向的空間長(zhǎng)度不一致if(stri=ch)/可處理成一致,亦可忽略這種不一致strcpy(str+i, str+i+1); len-;/注意else i+;*/*解 3void delchar(char ch)i=0,j=0;if(str)for(;ilen;i+)if(stri=ch)j=i;for(;jlen;j+)/循環(huán)將后面的字符向前挪動(dòng)一位 strj=strj+1;len-;i-;*/string& operator=(string &s) / 賦值運(yùn)算只能用成員實(shí)現(xiàn)if(str)delete str; len=s.len; if(s.

20、str)str=new charlen+1; strcpy(str,s.str);elsestr=0; return *this;string & operator+=(string &s) /字符串拼接+=string t=*this;if(str)/調(diào)用拷貝構(gòu)造函數(shù),初始化 t(保存老串)delete str;/刪除老串 len=len+s.len;if(len)str = new charlen+1; strcpy(str,t.str);strcat(str,s.str);return *this;friend string operator+(string &s1, string &s

21、2); /字符串拼接 +,類外實(shí)現(xiàn)operator=(string &s) /字符串比較if(strcmp(str,s.str)=0) return 1;elsereturn 0;/或 return(!strcmp(str, s.str);string operator+(string &s1, string &s2) /字符串拼接string t; t.len=s1.len+s2.len; if(t.len)t.str=new chart.len+1; strcpy(t.str,s1.str); strcat(t.str,s2.str);elset.str=0;+,類外實(shí)現(xiàn)return t;

22、 /因?yàn)榉祷貙?duì)象(動(dòng)態(tài)申請(qǐng)空間),所以要定義拷貝構(gòu)造函數(shù)void main( )char *a=C plus plus ;string s1(a), s2(language), s3;/測(cè)試兩種構(gòu)造函數(shù)s1.show( );s2.show( );s3.show( );cout Befor assign:n;if(s1=s2)/測(cè)試比較運(yùn)算符 = =couts1 and s2 is same!endlendl; if(!(s1=s2)couts1 and s2 is different!endlendl;s1=s2; /測(cè)試賦值運(yùn)算符 =cout After assign s1=s2:n; if

23、(s1=s2)couts1 and s2 is same!endlendl; if(!(s1=s2)couts1 and s2 is different!endlendl;s3=s1+s2; /測(cè)試加法及賦值運(yùn)算符 +=,=s3.show( );s3+=s2; /測(cè)試運(yùn)算符s3.show( );+=s3.delchar(e); /想s3.show( );,能否處理成s3-e/測(cè)試刪除字符串函數(shù)s3.delchar(a);s3.show( );s3.delchar(g);s3.show( );5: #include class Matrix*p, m, n;public:Matrix(mm,nn

24、 )m=mm, n=nn;p=newm*n;Matrix(Matrix &b)m=b.m; n=b.n;p=newm*n;for(i=0; im*n; i+)pi = (b.p)i;void input( )i;for(i=0; ipi;Matrix operator+(Matrix &b) / ?if(m!=b.m | n!=b.n)coutThe two matrix are not same size!n; return *this;for(i=0; im*n; i+) pi += (b.p)i;return *this;void operator =( Matrix &b)if(m!=

25、b.m | n!=b.n)coutThe two matrix are not same size!n;for(i=0; im*n; i+) pi = (b.p)i;void show( )i,j;*p1=p; for(i=0; im; i+)for(j=0; jn; j+) cout(*p1+)t;coutendl;coutendl;Matrix( )if(p) delete p;void main(void)m,n;coutmn;Matrix A(m,n), B(m,n);coutPlease input the A.input();B = A;B.show( ); Matrix C(A); C.show( ); C=A+B;C.show();matrix : ;6:#include class Shpublic:virtual double Area()=0;virtual void Setdata(double,double=0)=0;class Triangle:pu

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論