<span id="plx27"><var id="plx27"></var></span>
<dfn id="plx27"><var id="plx27"></var></dfn>
  • <span id="plx27"><code id="plx27"><input id="plx27"></input></code></span>
    <menu id="plx27"></menu><menuitem id="plx27"><thead id="plx27"><input id="plx27"></input></thead></menuitem>
  • <label id="plx27"><code id="plx27"></code></label>
    <label id="plx27"><button id="plx27"></button></label>
  • 歡迎來到裝配圖網! | 幫助中心 裝配圖網zhuangpeitu.com!
    裝配圖網
    ImageVerifierCode 換一換
    首頁 裝配圖網 > 資源分類 > DOC文檔下載  

    《C面向對象程序設計》習題與上機解答-提交稿

    • 資源ID:33417370       資源大?。?span id="qwvkehn" class="font-tahoma">397KB        全文頁數:98頁
    • 資源格式: DOC        下載積分:8積分
    快捷下載 游客一鍵下載
    會員登錄下載
    微信登錄下載
    三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
    二維碼
    微信掃一掃登錄
    下載資源需要8積分
    郵箱/手機:
    溫馨提示:
    用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
    支付方式: 支付寶    微信支付   
    驗證碼:   換一換

     
    賬號:
    密碼:
    驗證碼:   換一換
      忘記密碼?
        
    友情提示
    2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網頁到桌面,就可以正常下載了。
    3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
    4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經過壓縮,下載后原文更清晰。
    5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

    《C面向對象程序設計》習題與上機解答-提交稿

    C+面向對象程序設計習題與上機實驗題解答陳維興 陳昕 編著人民郵電出版社 目 錄第1章 面向對象方法概述1.1 習題參考解答第2章 C+的初步知識2.1 習題參考解答2.2 上機實驗題參考解答第3章 類和對象3.1 習題參考解答3.2 上機實驗題參考解答第4章 類和對象的進一步討論4.1 習題參考解答4.2 上機實驗題參考解答第5章 繼承與派生5.1 習題參考解答5.2 上機實驗題參考解答第6章 多態(tài)性與虛函數6.1 習題與參考解答6.2 上機實驗題與參考解答第7章 運算符重載7.1 習題參考解答7.2 上機實驗題參考解答第8章 模板8.1 習題參考解答8.2 上機實驗題參考解答第9章 C+的輸入和輸出9.1 習題參考解答9.2 上機實驗題參考解答第10章 異常處理和命名空間10.1 習題參考解答10.2 上機實驗題參考解答第11章 綜合設計與實現11.1 習題參考解答11.2 上機實驗題參考解答第1章 面向對象方法概述1.1 習題參考解答【1.1】【解】面向過程程序設計的主要特征是:程序由過程定義和過程調用組成(所謂過程,簡單地說,就是程序執(zhí)行某項操作的一段代碼,函數是最常用的過程。),從這個意義出發(fā), 基于面向過程的程序可以用以下的公式來表述:程序 = 過程 + 調用【1.2】 【解】面向過程程序設計中普遍采用的優(yōu)化方法是使用結構化程序設計方法,其局限性至少有以下幾個方面: (1) 面向過程程序設計方法開發(fā)軟件的生產效率低下(2) 面向過程程序設計方法難以應付日益龐大的信息量和多樣的信息類型 (3) 面向過程程序設計方法難以適應各種新環(huán)境【1.3】 【解】 面向對象程序設計是一種新的程序設計范型。這種范型的主要特征是:程序 = 對象 + 消息對于面向對象的程序設計,程序員注重的是類的設計和編寫,即問題域中涉及幾個類,各個類之間的關系如何,每個類包含哪些數據和函數(操作代碼),再由類生成其對象。程序中的一切操作都是通過向對象發(fā)送消息來實現的,對象接收到消息后,啟動有關方法(通過成員函數)完成相應的操作?!?.4】 【解】現實世界中的對象,具有以下特性:(1) 有一個名字:每一個對象必須有一個名字,稱為對象名,以區(qū)別于其他對象;(2) 有一組屬性:用屬性來描述它的某些特征,一般可以用數據來表示,所有的屬性都有值;(3) 有一組行為: 對象的行為或功能也稱為方法,一般用一組操作來描述;(4) 有一組接口:除施加于對象內部的操作外,對象還提供了一組公有操作用于與外界接口,從而可以與其他對象建立關系?!?.5】【解】在面向對象程序設計中,對象是描述其屬性的數據以及對這些數據施加的一組操作封裝在一起構成的統(tǒng)一體?!邦悺本褪蔷哂邢嗤臄祿▽傩裕┖拖嗤牟僮鞔a(函數)的一組對象的集合。類和對象之間的關系是抽象和具體的關系。類是多個對象進行綜合抽象的結果,一個對象是類的一個實例?!?.6】 什么是消息?【解】面向對象程序設計技術必須提供一種機制允許一個對象與另一個對象的交互。這種機制叫消息傳遞。一個對象向另一個對象發(fā)出的請求被稱為“消息”?!?.7】 【解】在面向對象程序設計中的消息傳遞實際是對現實世界中的信息傳遞的直接模擬。調用對象中的函數就是向該對象傳送一個消息,要求該對象實現某一行為(功能)。對象所能實現的行為(功能),在程序設計方法中稱為方法,它們是通過調用相應的函數來實現的,在C+語言中方法是通過成員函數來實現的。【1.8】 【解】在面向對象程序設計中,抽象是通過特定的實例(對象)抽取共同特性后形成概念的過程。C和C+中的數據類型就是對一批具體的數的抽象。例如,“整型數據”是對所有整數的抽象。封裝是面向對象程序設計方法的一個重要特性,所謂封裝具有兩方面的含義:一是將有關的數據和操作代碼封裝在一個對象中,各個對象相對獨立、相不干擾。二是將對象中某些數據與操作代碼對外隱蔽,即隱蔽其內部細節(jié),只留下少量接口,以便與外界聯系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽。信息隱蔽有利于數據安全,防止無關人員訪問和修改數據。【1.9】 【解】以面向對象程序設計的觀點,繼承所表達的是類之間相關的關系。這種關系使得某一類可以繼承另外一個類的特征和能力。若類之間具有繼承關系,則它們之間具有下列幾個特性: (1) 類間具有共享特征(包括數據和操作代碼的共享); (2) 類間具有差別或新增部分(包括非共享的數據和操作代碼); (3) 類間具有層次結構?!?.10】 【解】從繼承源來分,繼承分為單繼承和多繼承。單繼承是指每個派生類只直接繼承了一個基類的特征。例如,圖1.1表示了一種單繼承關系。它表示Windows操作系統(tǒng)的窗口之間的繼承關系。 窗口對話窗口編輯窗口 圖1.1 單繼承示意圖多繼承是指多個基類派生出一個派生類的繼承關系。多繼承的派生類直接繼承了不止一個基類的特征。例如,小孩喜歡的玩具車即繼承了車的一些特性,還繼承了玩具的一些特征。如圖1.2所示。 車 玩具 玩具車圖1.2 多繼承示意圖【1.11】【解】多態(tài)性是面向對象程序的重要特征。多態(tài)性是指不同的對象收到相同的的消息時執(zhí)行不同的操作。例如,我們同樣雙擊Window系統(tǒng)桌面上的圖標時,有的是打開多媒體播放器,有的是打開資源管理器。多態(tài)性增強了軟件的靈活性和重用性,為軟件的開發(fā)與維護提供了極大的便利。尤其是采用了虛函數和動態(tài)聯編機制后,允許用戶以更為明確、易懂的方式去建立通用的軟件?!?.12】 【解】面向對象程序設計的優(yōu)點主要包括以下幾個方面:(1) 可提高程序的重用性面向對象程序設計方法能比較好地解決軟件重用的問題。對象所固有的封裝性和信息隱藏等機理,使得對象內部的實現與外界隔離,具有較強的獨立性,它可以作為一個大粒度的程序構件,供同類程序直接使用。有兩種方法可以重復使用一個對象類:一種方法是建立在各種環(huán)境下都能使用的類庫,供相關程序直接使用;另一種方法是從它派生出一個滿足當前需要的新類。繼承性機制使得子類不僅可以重用其父類的數據和程序代碼,而且可以在父類代碼的基礎上方便地修改和擴充,這種修改并不影響對原有類的使用。(2) 可控制程序的復雜性面向對象程序設計方法采用了封裝和信息隱藏技術,把數據及對數據的操作放在一個個類中,作為相互依存、不可分割的整體來處理。這樣,在程序中任何要訪問這些數據的地方都只需簡單地通過傳遞信息和調用方法來進行,這就有效地控制了程序的復雜性。(3) 可改善程序的可維護性在面向對象程序設計方法中,對對象的操作只能通過消息傳遞來實現,所以只要消息模式即對應的方法界面不變,方法體的任何修改不會導致發(fā)送消息的程序修改,這顯然對程序的維護帶來了方便。另外,類的封裝和信息隱藏機制使得外界對其中的數據和程序代碼的非法操作成為不可能,這也就大大地減少了程序的錯誤率。(4) 能夠更好地支持大型程序設計類是一種抽象的數據類型,所以類作為一個程序模塊,要比通常的子程序的獨立性強的多,面向對象技術在數據抽象上又引入了動態(tài)連接和繼承性等機制,進一步發(fā)展了基于數據抽象的模塊化設計,使其更好地支持大型程序設計。(5) 增強了計算機處理信息的范圍面向對象程序設計方法把描述事物靜態(tài)屬性的數據結構和表示事物動態(tài)行為的操作放在一起構成一個整體,完整地、自然地表示客觀世界中的實體。用類來直接描述現實世界中的類型,可使計算機系統(tǒng)的描述和處理對象從數據擴展到現實世界和思維世界的各種事物,這實際上大大擴展了計算機系統(tǒng)處理的信息量和信息類型。第2章 C+的初步知識2.1 習題參考解答【2.1】【解】C+語言的主要特點表現在兩個方面,一是全面兼容C,并對C的功能作了不少擴允,二是增加了面向對象的機制。具體表現為:(1) C+是C的超集,C+保持與C的兼容,這就使許多C代碼不經修改就可以為C+所用,用C編寫的眾多的庫函數和實用軟件基本上可以不加修改地用于C+。(2) C+ 是一個更好的C,它保持了C的簡潔、高效和接近匯編語言等特點,并對C的功能作了不少擴允。用C+編寫的程序比C更安全,可讀性更好,代碼結構更為合理。(3) 用C+編寫的程序質量高,從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大的提高,使得大中型的程序開發(fā)變得更加容易。(4) 增加了面向對象的機制, C+幾乎支持所有的面問對象程序設計特征,體現了近20年來在程序設計和軟件開發(fā)領域出現的新思想和新技術。C+語言最有意義的方面是支持面向對象的特征,然而,由于C+與C保持兼容,使得C+不是一個純正的面向對象的語言,C+既可用于面向過程的結構化程序設計,也可用于面向對象的程序設計?!?.2】 【解】#include<iostream> /編譯預處理命令using namespace std; /使用命令空間stddouble circle(double r) /定義函數circle return 3.14*r*r;double triangle(double h,double w) /定義函數triangle return 0.5*h*w;int main() /定義主函數main double r,h,w; double cs,ts; cout<<"Input r,h,w:" cin>>r>>h>>w; /輸入圓的半徑和三角形高和底的值 cs= circle(r); /調用函數circle ts= triangle(h,w); /調用函數trianglecout<<"The area of circle is: "<<cs<<endl; /輸出圓的面積 cout<<"The area of triangle is:"<<ts; /輸出三角形的面積 return 0;程序的一次運行結果如下:Input r,h,w:10 20 10The area of circle is: 314The area of triangle is:100【2.3】【解】B【2.4】【解】C【2.5】【解】C【2.6】【解】C【2.7】 【解】C【2.8】【解】A【2.9】【解】B【2.10】 【解】D【2.11】【解】D【2.12】【解】 C【2.13】【解】 D說明:“int *p=new int(5);”表示動態(tài)分配1個整型內存空間,初值為5;“int *p=new int5;”表示動態(tài)分配5個整型內存空間;“int *p=new int;”表示動態(tài)分配1個整型內存空間;“int *p=new int5(0)”想給一個數組分配內存空間時,對數組進行初始化,這是不允許的?!?.14】 【解】 D說明:name被定義為指向常量的常指針, 這個指針變量所指的地址不能改變,它所指向的地址中的數據也不能改變?!皀ame3=a;”修改了name所指向的地址中的數據,“name="lin"”和“name=new char5;”修改了name所指的地址,只有D輸出一個字符是正確的?!?.15】 【解】 A說明:name被定義常指針,它所指向的地址中的數據能改變,但它所指的地址不能改變?!皀ame3=q;”修改了name所指向的地址中的數據,是正確的。而“name="lin"”、“name=new char5;”和“name=new char(q);”以不同的方法修改了name所指的地址,都是錯誤的。【2.16】【解】 A說明:name被定義指向常量的指針, 它所指向的地址中的數據不能改變,但它所指的地址可以修改,而“name3=q;”修改了name所指向的地址中的數據,是錯誤的?!皀ame="lin"” 、“name=new char5;”和“name= new char(q)”以不同的方法修改了name所指的地址,都是正確的。【2.17】【解】C【2.18】【解】 D說明:C+中不能建立引用數組和指向引用的指針,也不能建立引用的引用。所以A、B、C是錯誤的,D是正確的?!?.19】【解】A【2.20】【解】B【2.21】【解】(1) 這兩個函數原型是等價的,因為函數原型中的參數名可以缺省。(2) 這兩個函數的第一行是不等價的,函數的第一行中必須包含參數名?!?.22】【解】不可能通過編譯的原因是:在程序中,當一個函數的定義在后,而對它的調用在前時,必須將該函數的原型寫在調用語句之前,而在本程序中缺少函數原型語句。在語句“using namespace std;”后加上函數原型語句“sum(int a,int b);”就可通過編譯?!?.23】【解】本程序的運行結果如下:x+y=65【2.24】【解】本程序的運行結果如下:101說明: 在語句“:i=i+1;”中賦值號左邊“:i”的中i是全局變量,賦值號右邊的i是局部變量。所以執(zhí)行該語句的結果是將局部變量i的值加1(即101)后賦值給全局變量i。【2.25】【解】本程序的運行結果如下:10 10說明:函數f(&m,n)中 第1個參數是引用參數, 引用參數是一種按地址傳遞參數的方法,對其的調用是傳地址調用;而第2個參數是變量參數,對它的調用是傳值調用。所以調用函數f后, 實參a的值被改為10, 實參b的值不變,仍為10?!?.26】【解】本程序的運行結果如下:1020說明:函數f的參數是變量的引用, 對它的調用是傳地址調用,所以函數f調用后,主函數中k的值變?yōu)?0。又由于m是對函數f的引用,當m被賦值為20時,k的值也變?yōu)?0 ?!?.27】 【解】程序的作用是:輸入3個整數,然后輸出其中值最大的數。在主函數中輸入3個整數,然后調用f函數,在f函數中實現找最小的整數,用if語句比較兩個數,將大者存放在變量m中,經過兩個if語句的比較,m中存放的是3個整數中最大的數。運行情況如下:2 4 7 (輸入3個整數)7 (輸出其中最大的數)【2.28】 【解】實現本題功能的程序如下:#include<iostream>#include<cmath>using namespace std;int main() float x,y; cout<<"please input 2 floats to x,y:" cin>>x>>y; float z=pow(x,y); cout<<"pow("<<x<<","<<y<<")="<<z<<endl; return 0;本程序的運行結果是:please input 2 floats to x,y:2.1 3pow(2.1,3)=9.261說明:由于要用到系統(tǒng)函數pow(x,y),所以要包含頭文件cmath?!?.29】【解】實現本題功能的程序如下:#include<iostream> using namespace std;int main() int *p=new int20; /動態(tài)分配20個整型內存空間 *p=1; *(p+1)=1; /對前面2個內存空間賦值1 cout<<*p<<"t"<<*(p+1)<<"t" p=p+2; /p指向第3個內存空間 for (int i=3;i<=20;i+) *p=*(p-1)+*(p-2); cout<<*p<<"t" if (i%5=0) cout<<endl;p+; /p指向下一個內存空間;return 0;本程序的運行結果是:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 6765【2.30】 【解】實現本題功能的程序如下:#include<iostream> #include<cmath> using namespace std;double sroot(int i) return sqrt(i);double sroot(long l) return sqrt(l); double sroot(double d) return sqrt(d);int main() int i=12; long l=1234; double d=12.34;cout<<"i的二次方根是:"<<sroot(i)<<endl;cout<<"l的二次方根是:"<<sroot(l)<<endl;cout<<"d的二次方根是:"<<sroot(d)<<endl;return 0;本程序的運行結果是:i的二次方根是:3.4641l的二次方根是:35.1283d的二次方根是:3.512832.2 上機實驗題參考解答【2.1】 【實驗步驟】在第一次上機時,按以下步驟建立和運行C+程序:(1) 先進入Visual C+6.0環(huán)境。(2) 編輯 C+源程序。按照第12章介紹的單文件程序的編輯方法,在自己指定的子目錄中(例如D:C+)建立一個名為test1_1.cpp的新文件(此時尚未向文件輸入內容) ,并從鍵盤輸入以上的源程序。(3) 編譯C+程序。 選擇“Build(編譯)Compile test2_1.cppp(編譯test2_1.cpp)”命令,對此源程序進行編譯。觀察和分析編譯信息。(注:以上括號中的內容是Visual C+ 6.0中文版中的中文顯示,以下同。)根據編譯信息指出的錯誤,修改程序,再進行編譯。如果還有錯,再重復此過程,直到編譯信息提示:“test2_1.obj - 0 error(s),0 warming(s)”,即既沒有error類型的語法錯誤,也沒有warming類型的語法錯誤,這時產生一個test2_1.obj文件。 (4)連接C+程序。選擇“Build(編譯)Build test2_1.exe(構建test2_1.exe)”命令,對程序進行連接,如果不出錯,就會生成可執(zhí)行程序test2_1.exe。(5) 運行C+程序。選擇“BuildExecute test2_1.exe(執(zhí)行Execute test2_1.exe)”命令,執(zhí)行可執(zhí)行程序test2_1.exe。觀察屏幕的變化。在輸出窗口應顯示如下運行結果: Hello!This is a program.(6) 分析運行結果。分析結果是否正確,如果不正確或認為輸出格式不理想,可以修改程序,然后重新執(zhí)行以上步驟。(7) 關閉工作空間。在執(zhí)行完一個程序,編輯和運行新的程序前,應執(zhí)行“File(文件)->Close Workspace(關閉工作區(qū))”命令,則結束對該程序的的操作。若要退出VC+環(huán)境,則執(zhí)行“File(文件)->Exit(退出)”命令?!具\行結果】Hello!This is a program.【2.2】 【錯誤分析】 編譯程序,提示有4個error錯誤,1個warming錯誤。 編譯出錯信息告知在第3行有2個error錯誤,第1個錯誤的原因是cout未經聲明,第2個錯誤的原因是運算符“<<”不合法。這都是因為流對象cout是標準的輸出流對象,它在文件iostream中聲明,因此必須包含頭文件iostream。因此應添加以下語句:#include<iostream>using namespace std; 編譯出錯信息告知在第5行有2個error錯誤。第1個error錯誤的原因是運算符“<<”不合法,原因與第3行的相同。第5行的第2個error錯誤原因是第5行少了1個分號“;”,這是因為每條語句需要由分號作為結束符。也許讀者要問,明明這兩個錯誤都是出現在第4行,為什么說成第5行有錯呢?這是因為C+允許將一條語句分寫成幾行,檢查完第4行沒有分號后,必須檢查下一行,直到發(fā)現第5行的“” 前都沒有“;” 時,才判定出錯。因此在第5行報錯。修改方法是:在第5行語句的末尾加上“;”。 編譯出錯信息告知第5行有1個warming錯誤,原因是main函數默認的返回值類型是int, 而main函數中沒有返回值。修改方法:在“”前加上返回語句“return 0;”。【修改后的程序】/test2_2_1_2.cpp#include<iostream>using namespace std;int main() cout<<"Hello!n" cout<<"Welcome to C+!"<<endl; return 0;【運行結果】Hello!Welcome to C+!(2)/test2_2_2_1.cpp#include<iostream>using namespace std;int main() int x,y; x=5; y=6; int z=x*y; cout<<"x*y="<<z<<endl; return 0;)【錯誤分析】 編譯程序,提示有2個error錯誤。第1個錯誤信息告知在第11行出錯,出錯原因是“” 錯寫成“)”; 由于同樣的原因造成了第2個錯誤,即第12行找不到文件的結束符。修改方法:將“)”改為“”。 【修改后的程序】/test2_2_2_2.cpp#include<iostream>using namespace std;int main() int x,y; x=5; y=6; int z=x*y; cout<<"x*y="<<z<<endl; return 0;【運行結果】x*y=30(3)/test2_2_3_1.cpp#include<iostream>using namespace std; int main() void fun(int,int&); int x,y; fun(3,x); fun(4,y); cout<<"x+y=<<x+y<<endl; return 0;void fun(int m,int &n) n=m*5【錯誤分析】本題有兩處錯誤:) 語句“cout<<"x+y=<<x+y<<endl;”缺少一個“"”號,應將其修改為: cout<<"x+y="<<x+y<<endl;) 函數fun中的語句“n=m*5”缺少一個“;”號,應將其修改為:n=m*5;【修改后的程序】/test2_2_3_2.cpp#include<iostream>using namespace std;int main() void fun(int,int&); int x,y; fun(3,x); fun(4,y); cout<<"x+y="<<x+y<<endl; return 0;void fun(int m,int &n) n=m*5;【運行結果】x+y=35 【結果分析】 使用引用作函數的形參時,調用函數的實參要用變量名。實參傳遞給形參,相當于在被調用函數中使用了實參的別名。于是,在被調用函數中對形參的操作實質是對實參的操作,即數據的傳遞是雙向的。 程序在第1次調用fun()時,使得x得到的值是15;程序在第2次調用fun()時,使得y得到的值是35?!?.3】 【參考程序】/test2_3.cpp#include<iostream>using namespace std;int maxl(int x,int y) return(x>y ? x:y);int maxl(int x,int y,int z) int temp=maxl(x,y);return(temp>z ? temp:z);double maxl(double x,double y) return(x>y ? x:y);double maxl(double x,double y,double z) double temp=maxl(x,y); return(temp>z ? temp:z);char maxl(char x,char y) return(x>y ? x:y);int maxl(char x,char y,char z) int temp=maxl(x,y);return(temp>z ? temp:z);int main() int x1,x2;double d1,d2;char c1,c2;x1=maxl(3,5);x2=maxl(4,5,8);c1=maxl(a,b);c2=maxl(d,e,h);d1=maxl(3.1,5.6);d2=maxl(15.3,13.4,27.8);cout<<"maxl(3,5)="<<x1<<endl;cout<<"maxl(4,5,8)="<<x2<<endl;cout<<"maxl(3.1,5.6)="<<d1<<endl;cout<<"max1(15.3,13.4,27.8)="<<d2<<endl;cout<<"maxl(a,b)="<<c1<<endl;cout<<"maxl(d,e,h)="<<c2<<endl;return 0;【運行結果】maxl(3,5)=5maxl(4,5,8)=8maxl(3.1,5.6)=5.6max1(15.3,13.4,27.8)=27.8maxl(a,b)=bmaxl(d,e,h)=h【2.4】 【參考程序】/test2_4.cpp#include<iostream>using namespace std;void change(char&,char&);int main() char x,y;cin>>x>>y;if(x<y)change(x,y); /如果x<y,使x和y的值互換cout<<"max="<<x<<" min="<<y<<endl;return 0;void change(char &t1,char &t2) /函數的作用是使t1與t2互換 char temp;temp=t1;t1=t2;t2=temp;【運行結果】g jmax=j min=g【2.5】【參考程序】/test2_5.cpp#include<iostream>using namespace std;int main() double *r; r=new double; cin>>*r; cout<<"Area is:"<<3.14*(*r)*(*r)<<endl; delete r;return 0;【運行結果】12.34Area is:478.145第3章 類和對象3.1 習題參考解答【3.1】 【解】 類聲明的一般格式如下:class 類名public: 公有數據成員;公有成員函數;private:私有數據成員;私有成員函數; ;類的聲明由關鍵字class打頭,后跟類名,花括號中是類體,最后以一個分號“;”結束?!?.2】【解】C【3.3】【解】B【3.4】【解】B【3.5】【解】D【3.6】【解】B說明:C+中對構造函數有一些規(guī)定:不能帶返回值;可以不帶參數;也可以缺省定義;但構造函數的名字與類名必須完全相同?!?.7】【解】B【3.8】【解】C【3.9】【解】C【3.10】【解】B【3.11】【解】C說明:C+中對析構函數也有一些規(guī)定:沒有參數;不能重載;析造函數的名字與是在類名前加“”;析構函數不能指定返回類型?!?.12】 【解】C【3.13】【解】C【3.14】【解】B【3.15】【解】D【3.16】 【解】語句(1)使用帶默認參數的構造函數,或不帶參數的構造函數,定義了point類的兩個對象p2和p3;語句(2)在建立新對象p2時,用已經存在的對象P1去初始化新對象p2,在這個過程中用“賦值法”調用了拷貝構造函數。語句(3)在建立新對象p2時,用已經存在的對象P1去初始化新對象p2,在這個過程中用“代入法”調用了拷貝構造函數。語句(4)將對象p1數據成員的值拷貝到對象p4中, 這個過程是通過默認賦值運算符函數實現的?!?.17】【解】本程序的運行結果如下:Exit maindst 55【3.18】【解】本程序的運行結果如下: Counting at 0 Counting at 1 Counting at 2 Counting at 3 Counting at 4 Counting at 5 Couhting at 6 Counting at 7 Counting at 8 Counting at 9說明:在本程序中主函數main只包括了一個return語句,但竟然有內容輸出!什么時候調用了構造函數?我們知道,構造函數在對象被定義時調用。那么對象anObject是何時被調用的呢?在主函數main之前,語句“test anObject”處?!?.19】【解】本程序的運行結果如下:Con.Copy con.default.【3.20】【解】 第1個錯誤:printStu()和setSno兩個成員函數沒有用public定義,不允許外部函數對對象進行操作。第2個錯誤:成員函數在類外定義,應加上類名“Student:”。第3個錯誤:setAge應在類中說明,并且在類外定義時,應加上類名“Student:”?!?.21】【解】構造函數Point是私有的,語句“Point cpoint;”執(zhí)行時出現錯誤?!?.22】【解】 實現本題功能的程序如下:#include<iostream> using namespace std;class Circlepublic: Circle(float r)radius=r; float area()return 3.14*radius*radius;private: float radius;int main() float r;cout<<"請輸入圓的半徑:"cin>>r;Circle p(r);cout<<"半徑為"<<r<<"的圓的面積為:"<<p.area()<<endl;return 0;程序的運行結果是:請輸入圓的半徑:3半徑為3的圓的面積為:28.26【3.23】 【解】實現本題功能的程序如下:#include<iostream> using namespace std;class cylinderpublic: cylinder(double a,double b); void vol();private: double r,h; double volume;cylinder:cylinder(double a,double b) r=a; h=b; volume=3.141592*r*r*h;void cylinder:vol() cout<<"volume is:"<<volume<<"n"int main() cylinder x(2.2,8.09); x.vol();return 0;程序的運行結果是:volume is:123.011【3.24】【解】實現本題功能的程序如下:#include<iostream> using namespace std;class Date public: Date() Date(int y,int m,int d) year=y; mon=m; day=d; Date(Date&d) year=d.year; mon=d.mon; day=d.day; void SetDate(int Y,int m,int d) year=Y; mon=m; day=d; void printDate() cout<<"日期是:"<<year<<"年"<<mon<<"月"<<day<<"日"<<endl; int GetYear() return year; int GetMonth() return mon; int GetDay() return day; private: int day,mon,year;void main() Date d1(2010,6,8);cout<<"日期是:"<<d1.GetYear()<<"年"<<d1.GetMonth()<<"月"<<d1.GetDay()<<"日"<<endl; Date d2; d2.SetDate(2010,8,1);d2.printDate(); Date d3(d1);d3.printDate();程序的運行結果是:日期是:2010年6月8日日期是:2010年8月1日日期是:2010年6月8日3.2 上機實驗題參考解答【3.1】 (1)【運行結果】Copy-initialization Constructor is calledCopy-initialization Constructor is calledp3=(3,4)Destructor is callededDestructor is callededDestructor is calleded (2)【運行結果】Constructor is Called.Copy-initialization Constructor is calledCopy-initialization Constructor is calledp3=(3,4)Destructor is callededDestructor is callededDestructor is calleded【結果分析】 創(chuàng)建對象p1時,調用帶有兩個參數的構造函數,輸出第1行結果。 創(chuàng)建對象p2和p3時,調用拷貝構造函數,輸出第2行和第3行結果。 當程序運行結束,釋放對象p3、p2和p1時, 分別調用析構函數輸出最后3行結果。(3)【錯誤分析】 調試程序時,發(fā)現添加的兩條語句有錯。這是因為Coordinate類中沒有提供適合創(chuàng)建對象p4和p5的構造函數。為了解決這個問題,可以增加一個默認構造函數和帶一個參數的構造函數,但最簡單的方法是修改帶有兩個參數的構造函數, 使參數帶有默認值。如: Coordinate(int x1=0,int y1=0);這樣,創(chuàng)建對象p4時,2個參數分別使用默認值0和0;而創(chuàng)建對象p5時, 第1個參數為2,第2個參數使用默認值0。(4) 【運行結果】Constructor is Called.Copy-initialization Constructor is calledCopy-initialization Constructor is calledp3=(3,4)Constructor is Called.Constructor is Called.Destructor is callededDestructor is callededDestructor is callededDestructor is callededDestructor is calleded【結果分析】從輸出結果可以看出,程序調用了3次構造函數,2次拷貝構造函數。 創(chuàng)建對象時,將根據參數的情況調用相應的構造函數。程序在執(zhí)行語句Coordinate pl(3,4);Coordinate p4;Coordinate p5(2);創(chuàng)建對象p1、p4和p5時,調用了3次構造函數。 當用類的一個對象去創(chuàng)建該類的另一個對象時,將調用拷貝構造函數。程序在執(zhí)行語句Coordinate p2(p1);Coordinate p3=p2;創(chuàng)建對象p2和p3時,調用了2次拷貝構造函數?!?.2】【參考程序】/test3_2.cpp#include<iostream>using namespace std;#include<iomanip>class magic /聲明魔方類magicpublic: void getdata(); /輸入初值成員函數 void setfirstmagic(); /設置初始魔方成員函數 void generatemagic(); /生成最終魔方成員函數 void printmagic(); /顯示魔方成員函數private:int m44; int step; /相鄰元素之間的差值 int first; /起始值 int sum; /最大元素值和最小元素值的和;void magic:getdata() /輸入初值成員函數 cout<<"輸入4*4魔方起始值:" cin>>first; cout<<"輸入相鄰元素差值:"cin>>step;void magic:setfirstmagic() /設置初始魔方成員函數 int i,j; int tmp; tmp=first; for (i=0;i<4;i+) for (j=0;j<4;j+) mij=tmp; tmp+=step; void magic:generatemagic() /生成最終魔方成員函數 sum=m00+m33; for (int i=0,j=0;i<4;i+,j+) mij=sum-mij; for( i=0,j=3;i<4;i+,j-) mij=sum-mij;void magic:printmagic() /顯示魔方成員函數 int i,j; for (i=0;i<4;i+) for (j=0;j<4;j+) cout<<setw(5)<<mij; cout<<endl; int main() magic A; A.getdata(); A.setfirstmagic(); cout<<"初始魔方如下:"<<endl; A.printmagic(); A.generatemagic(); cout<<"最終魔方如下:"<<endl; A.printmagic(); return 0;【運行結果】程序的一次執(zhí)行結果如下:輸入4*4魔方起始值:1輸入相鄰元素差值:2初始魔方如下: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31最終魔方如下: 31 3 5 25 9 21 19 15 17 13 11 23 7 27 29 1【3.3】【參考程序】 /test3_3.cpp#include<iostream>#include<string>using namespace std;const len=5;int main() int i;void Reverse(string s);string strlen="Germany","Japan","America","Britain","France"cout<<"按逆轉前的順序輸出字符串:"<<endl;for(i=0;i<len;i+) cout<<stri<<" " /按逆轉以前的順序輸出字符串 cout<<endl;Reverse(str); /進行逆轉cout<<"按逆轉后的順序輸出字符串:"<<endl;for(i=0;i<len;i+) cout<<stri<<" " /按逆轉后的順序輸出字符串 cout<<endl;return 0;void Reverse(string s) string t; for( int i=0;i<len/2;i+) t=si; si=slen-1-i; slen-1-i=t;【運行結果】按逆轉前的順序輸出字符串:Germany Japan America Britain France按逆轉后的順序輸出字符串:France Britain America Japan Germany第4章 類和對象的進一步討論4.1 習題參考解答【4.1】【解】 所謂對象數組是指每一數組元素都是對象的數組,也就是說,若一個類有若干個對象,我們把這一系列的對象用一個數組來存放。對象數組的元素是對象,不僅具有數據成員,而且還有函數成員。【4.2】【解】對象指針就是用于存放對象地址的變量。聲明對象指針的一般語法形式為: 類名* 對象指針名;【4.3】【解】B【4.4】【解】C【4.5】【解】B說明:C+中規(guī)定,在建立對象前就可以為靜態(tài)數據成員賦值。同時規(guī)定在靜態(tài)成員函數中不能使用this指針;靜態(tài)成員函數在類外定義時,不需要用static前綴;靜態(tài)成員函數既可以在類內定義也可以在類外定義。【4.6】【解】D 【4.7】【解】C 【4.8】【解】D 【4.9】【解】A【4.10】【解】A

    注意事項

    本文(《C面向對象程序設計》習題與上機解答-提交稿)為本站會員(文***)主動上傳,裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。 若此文所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(點擊聯系客服),我們立即給予刪除!

    溫馨提示:如果因為網速或其他原因下載失敗請重新下載,重復下載不扣分。




    關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯系我們

    copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯系電話:18123376007

    備案號:ICP2024067431-1 川公網安備51140202000466號


    本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!

    欧美久久久一区二区三区,国产精品亚洲一区二区无码,亚洲国产精品综合久久20声音,亚洲国产精品无码久久久蜜芽
    <span id="plx27"><var id="plx27"></var></span>
    <dfn id="plx27"><var id="plx27"></var></dfn>
  • <span id="plx27"><code id="plx27"><input id="plx27"></input></code></span>
    <menu id="plx27"></menu><menuitem id="plx27"><thead id="plx27"><input id="plx27"></input></thead></menuitem>
  • <label id="plx27"><code id="plx27"></code></label>
    <label id="plx27"><button id="plx27"></button></label>