C面向?qū)ο?問答總結(jié)及實例_第1頁
C面向?qū)ο?問答總結(jié)及實例_第2頁
C面向?qū)ο?問答總結(jié)及實例_第3頁
C面向?qū)ο?問答總結(jié)及實例_第4頁
C面向?qū)ο?問答總結(jié)及實例_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一、簡答題 1. 什么是類?什么是對象?對象與類的關(guān)系是什么? 答:類就是相同的數(shù)據(jù)和相同的一組對象的集合,即類是對具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的一類對象的描述;對象是描述其屬性的數(shù)據(jù)以及對這些數(shù)據(jù)施加的一組操作封裝在一起構(gòu)成的統(tǒng)一體,對象可以認為是:數(shù)據(jù)操作;類和對象之間的關(guān)系是抽象和具體的關(guān)系。2. 構(gòu)造函數(shù)和析構(gòu)函數(shù)的主要作用是什么?他們各有什么特性? 答:構(gòu)造函數(shù)主要用于為對象分配空間,進行初始化。構(gòu)造函數(shù)除了具有一般成員函數(shù)的特征外,還具有一些特殊的性質(zhì):(1)構(gòu)造函數(shù)的名字必須與類名相同(2)構(gòu)造函數(shù)可以有任意類型的參數(shù),但不能指定返回類型。它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。(3

2、)構(gòu)造函數(shù)是特殊的成員函數(shù),函數(shù)體可寫在類體內(nèi),也可寫在類體外。(4)構(gòu)造函數(shù)可以重載,即一個類中可以定義多個參數(shù)個數(shù)或參數(shù)類型不同的構(gòu)造函數(shù)。(5)構(gòu)造函數(shù)被聲明為公有函數(shù),但它不能像其他成員函數(shù)那樣被顯式地調(diào)用,它是在定義對象的同時被調(diào)用的。 析構(gòu)函數(shù)也是一種特殊的成員函數(shù)。它執(zhí)行與構(gòu)造函數(shù)相反的操作,通常用于撤消對象時的一些清理任務,如釋放分配給對象的內(nèi)存空間等。析構(gòu)函數(shù)有以下一些特點:(1)析構(gòu)函數(shù)與構(gòu)造函數(shù)名字相同,但它前面必須加一個波浪號();(2)析構(gòu)函數(shù)沒有參數(shù),也沒有返回值,而且不能重載。因此在一個類中只能有一個析構(gòu)函數(shù);(3)當撤消對象時,編譯系統(tǒng)會自動地調(diào)用析構(gòu)函數(shù)。 3

3、. 有哪幾種繼承方式?每種方式的派生類對基類成員的繼承性如何? 答:三種繼承方式(公有public、保護protected、私有private);繼承性可參見教材P143?;?父類)得私有成員,派生類(子類)都不能訪問;基類得公有成員,派生類得繼承方式?jīng)Q定了其函數(shù)得形式!基類得保護成員在派生類得公有繼承中也是保護類型!4. 簡要敘述友元運算符函數(shù)和成員運算符函數(shù)有什么不同點? 答:(1)對雙目運算符而言,成員運算符函數(shù)帶有一個參數(shù),而友元運算符函數(shù)帶有兩個參數(shù);對單目運算符而言,成員運算符函數(shù)不帶參數(shù),而友元運算符函數(shù)帶一個參數(shù)。 (2)雙目運算符一般可以被重載為友元運算符函數(shù)或成員運算符函

4、數(shù),但某些情況,必須使用友元函數(shù)。5. 派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序是怎樣的? 答:當創(chuàng)建對象時,編譯系統(tǒng)會自動調(diào)用構(gòu)造函數(shù)。當撤銷對象時,編譯系統(tǒng)會自動調(diào)用析構(gòu)函數(shù)。當創(chuàng)建派生類的對象時,首先執(zhí)行基類的構(gòu)造函數(shù),然后執(zhí)行派生類的構(gòu)造函數(shù)。當撤銷對象時,則先執(zhí)行派生類的析構(gòu)函數(shù),然后再執(zhí)行基類的析構(gòu)函數(shù)。6. 什么是虛函數(shù)?虛函數(shù)與函數(shù)重載有哪些相同點和不同點? 答:虛函數(shù)是一個在某基類中聲明為virtual并在一個或多個派生類中被重新定義的成員函數(shù)。聲明虛函數(shù)的格式如下: virtual ();在派生類中重新定義基類的虛函數(shù)是函數(shù)重載另一種形式,但它不同于一般的函數(shù)重載。當普通的函數(shù)重

5、載時,其函數(shù)的參數(shù)或參數(shù)類型必須有所不同,函數(shù)的返回類型也可以不同。對于虛函數(shù),如果僅僅是返回類型不同,其余均相同,系統(tǒng)會給錯誤信息;若僅僅函數(shù)名相同,而參數(shù)的個數(shù)、類型或順序不同,系統(tǒng)將它作為普通的函數(shù)重載,這時虛函數(shù)的特性將丟失。7. 函數(shù)重載 答:函數(shù)重載是指具有相似功能的不同函數(shù)使用同一函數(shù)名,但這些同名函數(shù)的參數(shù)類型、參數(shù)個數(shù)、返回值、函數(shù)功能可以不同。編譯系統(tǒng)將根據(jù)函數(shù)參數(shù)的類型和個數(shù)來判斷使用哪一個函數(shù)。體現(xiàn)了C+對多態(tài)性的支持。8. 函數(shù)模板答:可以把邏輯功能相同而函數(shù)參數(shù)和返回值類型不同的多個重載函數(shù)用一個函數(shù)來描述。參數(shù)化的函數(shù)稱為函數(shù)模板,代表的是一個函數(shù)家族。定義:te

6、mplate () 9. 類的繼承和派生答:類的繼承就是根據(jù)一個類創(chuàng)建一個新類的過程。類的派生就是從已有類產(chǎn)生新類的過程。10. 多態(tài)性及其實現(xiàn)答:多態(tài)性是指發(fā)出同樣的消息被不同類型的對象接收時導致完全不同的行為。多態(tài)的實現(xiàn):a) 函數(shù)重載b) 運算符重載c) 虛函數(shù)賦值兼容規(guī)則11. 賦值兼容規(guī)則答:一個公有派生類的對象在使用上可以被當作基類的對象,反之則禁止。具體表現(xiàn)在:a) 派生類的對象可以被賦值給基類對象。b) 派生類的對象可以初始化基類的引用。c) 指向基類的指針也可以指向派生類12. 聯(lián)編:靜態(tài)聯(lián)編,動態(tài)聯(lián)編答:聯(lián)編又稱綁定:是指計算機程序自身彼此關(guān)聯(lián)的過程,也就是把一個函數(shù)名和一

7、個函數(shù)體聯(lián)系在一起的過程靜態(tài)聯(lián)編:在編譯過程中,編譯系統(tǒng)可以根據(jù)類型匹配等特征來確定程序中調(diào)用操作與執(zhí)行某個同名函數(shù)實現(xiàn)之間的關(guān)系,即確定某一個同名函數(shù)到底是要調(diào)用哪一段函數(shù)實現(xiàn)代碼。函數(shù)重載和運算符重載就是通過靜態(tài)聯(lián)編方式實現(xiàn)的編譯時的多態(tài)的體現(xiàn)。靜態(tài)聯(lián)編的優(yōu)點是函數(shù)調(diào)用速度快、效率較高,缺點是編程不夠靈活 動態(tài)聯(lián)編:只有在運行程序時才能確定將要調(diào)用的函數(shù)。這種在運行階段進行的聯(lián)編稱為動態(tài)聯(lián)編。動態(tài)聯(lián)編的優(yōu)點是提供了更好的編程靈活性、問題抽象性和程序易維護性,缺點是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢13. 純虛函數(shù)和抽象類答:帶有純虛函數(shù)的類稱為抽象類:抽象類的主要作用是將有關(guān)的派生類組織在一個

8、繼承層次結(jié)構(gòu)中,由抽象類為它們提供一個公共的根,相關(guān)的派生類就從這個根派生出來。定義:class 類名 virtual 類型 函數(shù)名(參數(shù)表)=0; 二、編程題 例1、 示例運算符重載,并與用成員函數(shù)實現(xiàn)的方式進行比較。計算應付給的人民幣。#include class RMB /人民幣類public:RMB(double d)yuan=(int)d;jf = (int)(d-yuan)*100);RMB interest(double rate); /計算利息RMB add(RMB d); /人民幣相加void display( )cout(yuan+jf/100.0)endl;RMB ope

9、rator+(RMB d) /運算符“+”重載函數(shù)return RMB(yuan+d.yuan+ (jf+d.jf)/100.0);RMB operator*(double rate) /運算符“*”重載函數(shù)return RMB(yuan+jf/100.0)*rate);private:unsigned int yuan; /元unsigned int jf; /角分;RMB RMB:interest(double rate) return RMB(yuan+jf/100.0)*rate);RMB RMB:add(RMB d) return RMB (yuan+d.yuan+jf/100.0+

10、d.jf/100.0);/以下是計算應付人民幣的兩種方法RMB expense1(RMB principle,double rate) /采用普通成員函數(shù)求本利和 RMB interests=erest(rate); return principle.add(interests);RMB expense2(RMB principle,double rate) /采用運算符重載函數(shù)求本利和 RMB interests=principle*rate; /本金乘利率 return principle+interests; /本利和void main( ) RMB x=100

11、00.0; double yrate=0.035; expense1(x,yrate).display(); expense2(x,yrate).display();運行結(jié)果:1035010350例2、 示例運算符重載為成員函數(shù)形式。復數(shù)類加法、減法和賦值運算符重載。#include class Complex/復數(shù)類public:Complex(double r=0.0,double i=0.0)m_fReal=r;m_fImag=i; /構(gòu)造函數(shù)double Real()return m_fReal; /返回復數(shù)的實部double Imag()return m_fImag; /返回復數(shù)的虛

12、部Complex operator + (Complex &c); /復數(shù)加復數(shù)Complex operator + (double d); /復數(shù)加實數(shù)Complex operator - (Complex &c); /復數(shù)減復數(shù)Complex operator = (Complex x);/復數(shù)對象=復數(shù)private: double m_fReal,m_fImag; /私有數(shù)據(jù)成員;Complex Complex:operator+(Complex &c) /重載運算符“+”,兩個復數(shù)相加Complex temp;temp.m_fReal=m_fReal+c.m_fReal; /實部相加

13、temp.m_fImag=m_fImag+c.m_fImag; /虛部相加return temp;Complex Complex:operator +(double d) /重載運算符“+”,一個復數(shù)加一個實數(shù)Complex temp;temp.m_fReal=m_fReal+d;temp.m_fImag=m_fImag;return temp;Complex Complex:operator-(Complex &c) /重載運算符“-”,兩個復數(shù)相減Complex temp;temp.m_fReal=m_fReal-c.m_fReal; /實部相減temp.m_fImag=m_fImag-c

14、.m_fImag; /虛部相減return temp;Complex Complex:operator=(Complex c) /重載運算符“=”m_fReal=c.m_fReal;m_fImag=c.m_fImag;return* this; /*this表示當前對象void main()Complex c1(3,4),c2(5,6),c3,c4; /定義復數(shù)類的對象coutc1=c1.Real()+jc1.Imag()endl;coutc2=c2.Real()+jc2.Imag()endl;c3=c1+c2; /調(diào)用運算符“+”、“=”重載函數(shù),完成復數(shù)加復數(shù)coutc3=c1+c2=c3

15、.Real()+jc3.Imag()endl;c3=c3+6.5; /調(diào)用運算符“+”、“=”重載函數(shù),完成復數(shù)加實數(shù)coutc3+6.5=c3.Real()+jc3.Imag()endl;c4=c2-c1; /調(diào)用運算符“-”、“=”重載函數(shù),完成復數(shù)減復數(shù) coutc4=c2-c1=c4.Real()+jc4.Imag()endl;例3、 示例單目運算符“+”重載為成員函數(shù)形式。/example58.cpp#include class Clock /時鐘類public: Clock(int NewH=0,int NewM=0,int NewS=0); void ShowTime(); vo

16、id operator+(); /前綴單目運算符重載函數(shù)的聲明 void operator+(int); /后綴單目運算符重載函數(shù),加int參數(shù)以示區(qū)分private: int Hour,Minute,Second;Clock:Clock(int NewH,int NewM,int NewS) /構(gòu)造函數(shù) if(0=NewH&NewH24&0=NewM&NewM60& 0=NewS&NewS60) Hour=NewH; Minute=NewM; Second=NewS; else coutTime error!endl;void Clock:ShowTime() /顯示時間函數(shù)的實現(xiàn) cout

17、Hour:Minute:Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; cout=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; coutClock+:; void main() Clock myClock(11,59,59); coutFirst time output:; myClock.ShowTime(); myClock+; myCl

18、ock.ShowTime(); +myClock; myClock.ShowTime();運行結(jié)果:First time output:11:59:59Clock+:12:0:0+Clock:12:0:1例4、構(gòu)建一個類book,其中含有兩個私有數(shù)據(jù)成員qu和price,建立一個有5個元素的對象數(shù)組,將qu初始化為15,將price初始化為qu的10倍。顯示每個對象的qu*price。#include using namespace std; class bookpublic:void SetQu(double q)qu=q;void SetPrice(double p)price=p;voi

19、d OutPut()coutQu*Price=qu*priceendl;private:double qu,price;int main() book b5;for(int i=0;i5;i+)bi.SetQu(i+1);bi.SetPrice(i+1)*10);for(int i=0;i5;i+)bi.OutPut();return 0;例4、/*編寫一個對具有n 個元素的數(shù)組x求最大值的程序,要求將求最大值的函數(shù)設計成函數(shù)模板。思路分析:數(shù)組元素類型為模版參數(shù)指定的*/# include template T fun(T x,T y)return xy?x:y;#include max.h

20、void main()int a5=4,9,56,120,5;double b5=2.9,7.6,2.0,8.5,12.8;int i=0;int max1=a0;double max2=b0;for(i=0;i5;i+)max1=fun(max1,ai);max2=fun(max2,bi);cout數(shù)組a最大值是:max1endl;cout數(shù)組b最大值是:max2endl;例5、建立類普通的基類building,用來存儲一座樓房的層數(shù)、房間數(shù)以及它的總平方米數(shù)。建立派生類house,繼承building,并存儲臥室與浴室的數(shù)量,另外,建立派生類office,繼承building,并存儲滅火器

21、與電話的數(shù)目。創(chuàng)建一個office對象,設置相關(guān)屬性(如:滅火器數(shù)量和電話數(shù)目等),并顯示該屬性。 classbuilding private: intnFloors,nRooms; doublenAreas; public: building() building(intf):nFloors(f) building(intf,intr):nFloors(f),nRooms(r) building(intf,intr,doublea):nFloors(f),nRooms(r),nAreas(a) voidsetFloors(intn)nFloors=n; voidsetRooms(intn)n

22、Rooms=n; voidsetAreas(doublen)nAreas=n; intgetFloors()returnnFloors; intgetRooms()returnnRooms; doublegetAreas()returnnAreas; voiddisplay() coutFloors:nFloorsnRooms:nRoomsnAreasnAreasn; ; classhouse:publicbuilding private: intnBedRooms,nBathRooms; public: house():nBedRooms(0),nBathRooms(0) house(int

23、b):nBedRooms(b) house(intbed,intbath):nBedRooms(bed),nBathRooms(bath) voidsetBeds(intn)nBedRooms=n; voidsetBath(intn)nBathRooms=n; intgetBeds()returnnBedRooms; intgetBath()returnnBathRooms; voiddisplay() coutBedRooms:nBedRoomsnBathRooms:nBathRoomsn; ; classoffice:publicbuilding public: office():nApp

24、aratus(0),nTelephones(0) office(intapp):nApparatus(app) office(intapp,inttele):nApparatus(app),nTelephones(tele) voidsetApps(intn)nApparatus=n; voidsetTels(intn)nTelephones=n; intgetApps()returnnApparatus; intgetTels()returnnTelephones; voiddisplay() coutAppatatus:nApparatusnTelephones:nTelephonesn; private: intnApparatus,nTelephones; ; voidmain() cylindertempcy(3.5,2.0); tempcy.vol(); officetempoff(10,8); tempoff.display(); tempoff.setApps(20); tempoff.setTels(30); t

溫馨提示

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

評論

0/150

提交評論