《C面向?qū)ο蟪绦蛟O(shè)計》習題與上機解答-提交稿
《《C面向?qū)ο蟪绦蛟O(shè)計》習題與上機解答-提交稿》由會員分享,可在線閱讀,更多相關(guān)《《C面向?qū)ο蟪绦蛟O(shè)計》習題與上機解答-提交稿(98頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 《C++面向?qū)ο蟪绦蛟O(shè)計》 習題與上機實驗題解答 陳維興 陳昕 編著 人民郵電出版社 目 錄 第1章 面向?qū)ο蠓椒ǜ攀? 1.1 習題參考解答 第2章 C++的初步知識 2.1 習題參考解答 2.2 上機實驗題參考解答 第3章 類和對象 3.1 習題參考解答 3.2 上機實驗題參考解答 第4章 類和對象的進一步討論 4.1 習題參考解答 4.2 上機實驗題參考解答
2、 第5章 繼承與派生 5.1 習題參考解答 5.2 上機實驗題參考解答 第6章 多態(tài)性與虛函數(shù) 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章 綜合設(shè)計與實現(xiàn) 11.1 習題參考解答 11.2 上機實驗題參考解答
3、 第1章 面向?qū)ο蠓椒ǜ攀? 1.1 習題參考解答 【1.1】 【解】 面向過程程序設(shè)計的主要特征是:程序由過程定義和過程調(diào)用組成(所謂過程,簡單地說,就是程序執(zhí)行某項操作的一段代碼,函數(shù)是最常用的過程。),從這個意義出發(fā), 基于面向過程的程序可以用以下的公式來表述: 程序 = 過程 + 調(diào)用 【1.2】 【解】 面向過程程序設(shè)計中普遍采用的優(yōu)化方法是使用結(jié)構(gòu)化程序設(shè)計方法,其局限性至少有以下幾個方面: (1) 面向過程程序設(shè)計方法開發(fā)軟件的生產(chǎn)效率低下 (2) 面向過程程序設(shè)計方法難以應(yīng)付日益龐大的信息量和多樣的信息類型 (3) 面向過程程序設(shè)計方
4、法難以適應(yīng)各種新環(huán)境 【1.3】 【解】 面向?qū)ο蟪绦蛟O(shè)計是一種新的程序設(shè)計范型。這種范型的主要特征是: 程序 = 對象 + 消息 對于面向?qū)ο蟮某绦蛟O(shè)計,程序員注重的是類的設(shè)計和編寫,即問題域中涉及幾個類,各個類之間的關(guān)系如何,每個類包含哪些數(shù)據(jù)和函數(shù)(操作代碼),再由類生成其對象。程序中的一切操作都是通過向?qū)ο蟀l(fā)送消息來實現(xiàn)的,對象接收到消息后,啟動有關(guān)方法(通過成員函數(shù))完成相應(yīng)的操作。 【1.4】 【解】 現(xiàn)實世界中的對象,具有以下特性: (1) 有一個名字:每一個對象必須有一個名字,稱為對象名,以區(qū)別于其他對象; (2) 有一組屬性:用屬性來描述它的某
5、些特征,一般可以用數(shù)據(jù)來表示,所有的屬性都有值; (3) 有一組行為: 對象的行為或功能也稱為方法,一般用一組操作來描述; (4) 有一組接口:除施加于對象內(nèi)部的操作外,對象還提供了一組公有操作用于與外界接口,從而可以與其他對象建立關(guān)系。 【1.5】 【解】 在面向?qū)ο蟪绦蛟O(shè)計中,對象是描述其屬性的數(shù)據(jù)以及對這些數(shù)據(jù)施加的一組操作封裝在一起構(gòu)成的統(tǒng)一體?!邦悺本褪蔷哂邢嗤臄?shù)據(jù)(屬性)和相同的操作代碼(函數(shù))的一組對象的集合。 類和對象之間的關(guān)系是抽象和具體的關(guān)系。類是多個對象進行綜合抽象的結(jié)果,一個對象是類的一個實例。 【1.6】 什么是消息? 【解】 面向?qū)ο蟪绦蛟O(shè)計技術(shù)
6、必須提供一種機制允許一個對象與另一個對象的交互。這種機制叫消息傳遞。一個對象向另一個對象發(fā)出的請求被稱為“消息”。 【1.7】 【解】 在面向?qū)ο蟪绦蛟O(shè)計中的消息傳遞實際是對現(xiàn)實世界中的信息傳遞的直接模擬。調(diào)用對象中的函數(shù)就是向該對象傳送一個消息,要求該對象實現(xiàn)某一行為(功能)。對象所能實現(xiàn)的行為(功能),在程序設(shè)計方法中稱為方法,它們是通過調(diào)用相應(yīng)的函數(shù)來實現(xiàn)的,在C++語言中方法是通過成員函數(shù)來實現(xiàn)的。 【1.8】 【解】 在面向?qū)ο蟪绦蛟O(shè)計中,抽象是通過特定的實例(對象)抽取共同特性后形成概念的過程。C和C++中的數(shù)據(jù)類型就是對一批具體的數(shù)的抽象。例如,“整型數(shù)據(jù)”是對所
7、有整數(shù)的抽象。 封裝是面向?qū)ο蟪绦蛟O(shè)計方法的一個重要特性,所謂封裝具有兩方面的含義:一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,各個對象相對獨立、相不干擾。二是將對象中某些數(shù)據(jù)與操作代碼對外隱蔽,即隱蔽其內(nèi)部細節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽。信息隱蔽有利于數(shù)據(jù)安全,防止無關(guān)人員訪問和修改數(shù)據(jù)。 【1.9】 【解】 以面向?qū)ο蟪绦蛟O(shè)計的觀點,繼承所表達的是類之間相關(guān)的關(guān)系。這種關(guān)系使得某一類可以繼承另外一個類的特征和能力。 若類之間具有繼承關(guān)系,則它們之間具有下列幾個特性: (1) 類間具有共享特征(包括數(shù)據(jù)和操作代碼的
8、共享); (2) 類間具有差別或新增部分(包括非共享的數(shù)據(jù)和操作代碼); (3) 類間具有層次結(jié)構(gòu)。 【1.10】 【解】 從繼承源來分,繼承分為單繼承和多繼承。 單繼承是指每個派生類只直接繼承了一個基類的特征。例如,圖1.1表示了一種單繼承關(guān)系。它表示W(wǎng)indows操作系統(tǒng)的窗口之間的繼承關(guān)系。 窗口 對話窗口 編輯窗口 圖1.1 單繼承示意圖 多繼承是指多個基類派生出一個派生類的繼承關(guān)系。多繼承的派生類直接繼承了不止一個基類的特征。例如,小孩喜歡的玩具車即繼承了車的一些特性,
9、還繼承了玩具的一些特征。如圖1.2所示。 車 玩具 玩具車 圖1.2 多繼承示意圖 【1.11】 【解】 多態(tài)性是面向?qū)ο蟪绦虻闹匾卣?。多態(tài)性是指不同的對象收到相同的的消息時執(zhí)行不同的操作。例如,我們同樣雙擊Window系統(tǒng)桌面上的圖標時,有的是打開多媒體播放器,有的是打開資源管理器。 多態(tài)性增強了軟件的靈活性和重用性,為軟件的開發(fā)與維護提供了極大的便利。尤其是采用了虛函數(shù)和動態(tài)聯(lián)編機制后,允許用戶以更為明確、易懂的方式去建立通用的軟件。 【1.12】 【解】 面向?qū)ο蟪绦蛟O(shè)計的優(yōu)點主要包括以下幾個方面: (1) 可提高程序的重
10、用性 面向?qū)ο蟪绦蛟O(shè)計方法能比較好地解決軟件重用的問題。對象所固有的封裝性和信息隱藏等機理,使得對象內(nèi)部的實現(xiàn)與外界隔離,具有較強的獨立性,它可以作為一個大粒度的程序構(gòu)件,供同類程序直接使用。 有兩種方法可以重復(fù)使用一個對象類:一種方法是建立在各種環(huán)境下都能使用的類庫,供相關(guān)程序直接使用;另一種方法是從它派生出一個滿足當前需要的新類。繼承性機制使得子類不僅可以重用其父類的數(shù)據(jù)和程序代碼,而且可以在父類代碼的基礎(chǔ)上方便地修改和擴充,這種修改并不影響對原有類的使用。 (2) 可控制程序的復(fù)雜性 面向?qū)ο蟪绦蛟O(shè)計方法采用了封裝和信息隱藏技術(shù),把數(shù)據(jù)及對數(shù)據(jù)的操作放在一個個類中,作為相互依存、
11、不可分割的整體來處理。這樣,在程序中任何要訪問這些數(shù)據(jù)的地方都只需簡單地通過傳遞信息和調(diào)用方法來進行,這就有效地控制了程序的復(fù)雜性。 (3) 可改善程序的可維護性 在面向?qū)ο蟪绦蛟O(shè)計方法中,對對象的操作只能通過消息傳遞來實現(xiàn),所以只要消息模式即對應(yīng)的方法界面不變,方法體的任何修改不會導(dǎo)致發(fā)送消息的程序修改,這顯然對程序的維護帶來了方便。另外,類的封裝和信息隱藏機制使得外界對其中的數(shù)據(jù)和程序代碼的非法操作成為不可能,這也就大大地減少了程序的錯誤率。 (4) 能夠更好地支持大型程序設(shè)計 類是一種抽象的數(shù)據(jù)類型,所以類作為一個程序模塊,要比通常的子程序的獨立性強的多,面向?qū)ο蠹夹g(shù)在數(shù)據(jù)抽象上
12、又引入了動態(tài)連接和繼承性等機制,進一步發(fā)展了基于數(shù)據(jù)抽象的模塊化設(shè)計,使其更好地支持大型程序設(shè)計。 (5) 增強了計算機處理信息的范圍 面向?qū)ο蟪绦蛟O(shè)計方法把描述事物靜態(tài)屬性的數(shù)據(jù)結(jié)構(gòu)和表示事物動態(tài)行為的操作放在一起構(gòu)成一個整體,完整地、自然地表示客觀世界中的實體。用類來直接描述現(xiàn)實世界中的類型,可使計算機系統(tǒng)的描述和處理對象從數(shù)據(jù)擴展到現(xiàn)實世界和思維世界的各種事物,這實際上大大擴展了計算機系統(tǒng)處理的信息量和信息類型。 第2章 C++的初步知識 2.1 習題參考解答 【2.1】 【解】 C++語言的主要特點表現(xiàn)在兩個方面,一是全面兼容C,并對C的功能作了不少擴允,
13、二是增加了面向?qū)ο蟮臋C制。具體表現(xiàn)為: (1) C++是C的超集,C++保持與C的兼容,這就使許多C代碼不經(jīng)修改就可以為C++所用,用C編寫的眾多的庫函數(shù)和實用軟件基本上可以不加修改地用于C++。 (2) C++ 是一個更好的C,它保持了C的簡潔、高效和接近匯編語言等特點,并對C的功能作了不少擴允。用C++編寫的程序比C更安全,可讀性更好,代碼結(jié)構(gòu)更為合理。 (3) 用C++編寫的程序質(zhì)量高,從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大的提高,使得大中型的程序開發(fā)變得更加容易。 (4) 增加了面向?qū)ο蟮臋C制, C++幾乎支持所有的面問對象程序設(shè)計特征
14、,體現(xiàn)了近20年來在程序設(shè)計和軟件開發(fā)領(lǐng)域出現(xiàn)的新思想和新技術(shù)。
C++語言最有意義的方面是支持面向?qū)ο蟮奶卣?然而,由于C++與C保持兼容,使得C++不是一個純正的面向?qū)ο蟮恼Z言,C++既可用于面向過程的結(jié)構(gòu)化程序設(shè)計,也可用于面向?qū)ο蟮某绦蛟O(shè)計。
【2.2】
【解】
#include
15、 //定義函數(shù)circle { return 3.14*r*r; } double triangle(double h,double w) //定義函數(shù)triangle { return 0.5*h*w; } int main() //定義主函數(shù)main { double r,h,w; double cs,ts; cout<<"Input r,h,w:"; cin>>r>>h>>w; //輸入圓的半徑和三角形
16、高和底的值
cs= circle(r); //調(diào)用函數(shù)circle
ts= triangle(h,w); //調(diào)用函數(shù)triangle
cout<<"The area of circle is: "< 17、circle is: 314
The 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個整型內(nèi)存空間,初值為5;
“int *p=new int[5];”表示動態(tài)分配5個整型內(nèi)存空間;
“int *p=new int;”表示動 18、態(tài)分配1個整型內(nèi)存空間;
“int *p=new int[5](0)”想給一個數(shù)組分配內(nèi)存空間時,對數(shù)組進行初始化,這是不允許的。
【2.14】
【解】 D
說明:
name被定義為指向常量的常指針, 這個指針變量所指的地址不能改變,它所指向的地址中的數(shù)據(jù)也不能改變?!皀ame[3]=′a′;”修改了name所指向的地址中的數(shù)據(jù),“name="lin";”和“name=new char[5];”修改了name所指的地址,只有D輸出一個字符是正確的。
【2.15】
【解】 A
說明:
name被定義常指針,它所指向的地址中的數(shù)據(jù)能改變,但它所指的地址不能改變?!皀ame[3 19、]=′q′;”修改了name所指向的地址中的數(shù)據(jù),是正確的。而“name="lin";”、“name=new char[5];”和“name=new char(′q′);”以不同的方法修改了name所指的地址,都是錯誤的。
【2.16】
【解】 A
說明:
name被定義指向常量的指針, 它所指向的地址中的數(shù)據(jù)不能改變,但它所指的地址可以修改,而“name[3]=q;”修改了name所指向的地址中的數(shù)據(jù),是錯誤的?!皀ame=="lin";” 、“name=new char[5];”和“name= new char(′q′)”以不同的方法修改了name所指的地址,都是正確的。
【 20、2.17】
【解】C
【2.18】
【解】 D
說明:
C++中不能建立引用數(shù)組和指向引用的指針,也不能建立引用的引用。所以A、B、C是錯誤的,D是正確的。
【2.19】
【解】A
【2.20】
【解】B
【2.21】
【解】
(1) 這兩個函數(shù)原型是等價的,因為函數(shù)原型中的參數(shù)名可以缺省。
(2) 這兩個函數(shù)的第一行是不等價的,函數(shù)的第一行中必須包含參數(shù)名。
【2.22】
【解】
不可能通過編譯的原因是:在程序中,當一個函數(shù)的定義在后,而對它的調(diào)用在前時,必須將該函數(shù)的原型寫在調(diào)用語句之前,而在本程序中缺少函數(shù)原型語句。在語句“using namespace 21、std;”后加上函數(shù)原型語句“sum(int a,int b);”就可通過編譯。
【2.23】
【解】本程序的運行結(jié)果如下:
x+y=65
【2.24】
【解】本程序的運行結(jié)果如下:
101
說明:
在語句“::i=i+1;”中賦值號左邊“::i”的中i是全局變量,賦值號右邊的i是局部變量。所以執(zhí)行該語句的結(jié)果是將局部變量i的值加1(即101)后賦值給全局變量i。
【2.25】
【解】本程序的運行結(jié)果如下:
10 10
說明:
函數(shù)f(&m,n)中 第1個參數(shù)是引用參數(shù), 引用參數(shù)是一種按地址傳遞參數(shù)的方法,對其的調(diào)用是傳地址調(diào)用;而第2個參數(shù)是變量參數(shù),對它 22、的調(diào)用是傳值調(diào)用。所以調(diào)用函數(shù)f后, 實參a的值被改為10, 實參b的值不變,仍為10。
【2.26】
【解】本程序的運行結(jié)果如下:
10
20
說明:
函數(shù)f的參數(shù)是變量的引用, 對它的調(diào)用是傳地址調(diào)用,所以函數(shù)f調(diào)用后,主函數(shù)中k的值變?yōu)?0。又由于m是對函數(shù)f的引用,當m被賦值為20時,k的值也變?yōu)?0 。
【2.27】
【解】程序的作用是:輸入3個整數(shù),然后輸出其中值最大的數(shù)。在主函數(shù)中輸入3個整數(shù),然后調(diào)用f函數(shù),在f函數(shù)中實現(xiàn)找最小的整數(shù),用if語句比較兩個數(shù),將大者存放在變量m中,經(jīng)過兩個if語句的比較,m中存放的是3個整數(shù)中最大的數(shù)。運行情況如下:
2 23、4 7↙ (輸入3個整數(shù))
7 (輸出其中最大的數(shù))
【2.28】
【解】實現(xiàn)本題功能的程序如下:
#include 24、
}
本程序的運行結(jié)果是:
please input 2 floats to x,y:2.1 3↙
pow(2.1,3)=9.261
說明:
由于要用到系統(tǒng)函數(shù)pow(x,y),所以要包含頭文件cmath。
【2.29】
【解】實現(xiàn)本題功能的程序如下:
#include 25、值1
cout<<*p<<"\t"<<*(p+1)<<"\t";
p=p+2; //p指向第3個內(nèi)存空間
for (int i=3;i<=20;i++)
{ *p=*(p-1)+*(p-2);
cout<<*p<<"\t";
if (i%5==0) cout< 26、 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
【2.30】
【解】實現(xiàn)本題功能的程序如下:
#include 27、d)
{ return sqrt(d);
}
int main()
{ int i=12;
long l=1234;
double d=12.34;
cout<<"i的二次方根是:"< 28、在第一次上機時,按以下步驟建立和運行C++程序:
(1) 先進入Visual C++6.0環(huán)境。
(2) 編輯 C++源程序。
按照第12章介紹的單文件程序的編輯方法,在自己指定的子目錄中(例如D:\C++)建立一個名為test1_1.cpp的新文件(此時尚未向文件輸入內(nèi)容) ,并從鍵盤輸入以上的源程序。
(3) 編譯C++程序。
選擇“Build(編譯)→Compile test2_1.cppp(編譯test2_1.cpp)”命令,對此源程序進行編譯。觀察和分析編譯信息。(注:以上括號中的內(nèi)容是Visual C++ 6.0中文版中的中文顯示,以下同。)
根據(jù)編譯信息指出的 29、錯誤,修改程序,再進行編譯。如果還有錯,再重復(fù)此過程,直到編譯信息提示:“test2_1.obj - 0 error(s),0 warming(s)”,即既沒有error類型的語法錯誤,也沒有warming類型的語法錯誤,這時產(chǎn)生一個test2_1.obj文件。
(4)連接C++程序。
選擇“Build(編譯)→Build test2_1.exe(構(gòu)建test2_1.exe)”命令,對程序進行連接,如果不出錯,就會生成可執(zhí)行程序test2_1.exe。
(5) 運行C++程序。
選擇“Build→Execute test2_1.exe(執(zhí)行Execute test2_1.exe 30、)”命令,執(zhí)行可執(zhí)行程序test2_1.exe。觀察屏幕的變化。在輸出窗口應(yīng)顯示如下運行結(jié)果:
Hello!
This is a program.
(6) 分析運行結(jié)果。
分析結(jié)果是否正確,如果不正確或認為輸出格式不理想,可以修改程序,然后重新執(zhí)行以上步驟。
(7) 關(guān)閉工作空間。
在執(zhí)行完一個程序,編輯和運行新的程序前,應(yīng)執(zhí)行“File(文件)->Close Workspace(關(guān)閉工作區(qū))”命令,則結(jié)束對該程序的的操作。若要退出VC++環(huán)境,則執(zhí)行“File(文件)->Exit(退出)”命令。
【運行結(jié)果】
Hello!
This is a program.
【2.2 31、】
【錯誤分析】
編譯程序,提示有4個error錯誤,1個warming錯誤。
① 編譯出錯信息告知在第3行有2個error錯誤,第1個錯誤的原因是cout未經(jīng)聲明,第2個錯誤的原因是運算符“<<”不合法。這都是因為流對象cout是標準的輸出流對象,它在文件iostream中聲明,因此必須包含頭文件iostream。因此應(yīng)添加以下語句:
#include 32、r錯誤原因是第5行少了1個分號“;”,這是因為每條語句需要由分號作為結(jié)束符。也許讀者要問,明明這兩個錯誤都是出現(xiàn)在第4行,為什么說成第5行有錯呢?這是因為C++允許將一條語句分寫成幾行,檢查完第4行沒有分號后,必須檢查下一行,直到發(fā)現(xiàn)第5行的“}” 前都沒有“;” 時,才判定出錯。因此在第5行報錯。修改方法是:在第5行語句的末尾加上“;”。
③ 編譯出錯信息告知第5行有1個warming錯誤,原因是main函數(shù)默認的返回值類型是int, 而main函數(shù)中沒有返回值。修改方法:在“}”前加上返回語句“return 0;”。
【修改后的程序】
//test2_2_1_2.cpp
# 33、include 34、<<"x*y="< 35、out<<"x*y="< 36、}
【錯誤分析】
本題有兩處錯誤:
①) 語句“cout<<"x+y=< 37、 cout<<"x+y="< 38、test2_3.cpp
#include 39、(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=m 40、axl(3.1,5.6);
d2=maxl(15.3,13.4,27.8);
cout<<"maxl(3,5)="< 41、(3.1,5.6)=5.6
max1(15.3,13.4,27.8)=27.8
maxl(a,b)=b
maxl(d,e,h)=h
【2.4】
【參考程序】
//test2_4.cpp
#include 43、14*(*r)*(*r)< 44、3.4】
【解】B
【3.5】
【解】D
【3.6】
【解】B
說明:
C++中對構(gòu)造函數(shù)有一些規(guī)定:不能帶返回值;可以不帶參數(shù);也可以缺省定義;但構(gòu)造函數(shù)的名字與類名必須完全相同。
【3.7】
【解】B
【3.8】
【解】C
【3.9】
【解】C
【3.10】
【解】B
【3.11】
【解】C
說明:
C++中對析構(gòu)函數(shù)也有一些規(guī)定:沒有參數(shù);不能重載;析造函數(shù)的名字與是在類名前加“~”;析構(gòu)函數(shù)不能指定返回類型。
【3.12】
【解】C
【3.13】
【解】C
【3.14】
【解】B
【3.15】
【解】D
【3.16】
【 45、解】
語句(1)使用帶默認參數(shù)的構(gòu)造函數(shù),或不帶參數(shù)的構(gòu)造函數(shù),定義了point類的兩個對象p2和p3;
語句(2)在建立新對象p2時,用已經(jīng)存在的對象P1去初始化新對象p2,在這個過程中用“賦值法”調(diào)用了拷貝構(gòu)造函數(shù)。
語句(3)在建立新對象p2時,用已經(jīng)存在的對象P1去初始化新對象p2,在這個過程中用“代入法”調(diào)用了拷貝構(gòu)造函數(shù)。
語句(4)將對象p1數(shù)據(jù)成員的值拷貝到對象p4中, 這個過程是通過默認賦值運算符函數(shù)實現(xiàn)的。
【3.17】
【解】本程序的運行結(jié)果如下:
Exit main
dst 55
【3.18】
【解】本程序的運行結(jié)果如下:
Counting 46、 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
說明:
在本程序中主函數(shù)main只包括了一個return語句,但竟然有內(nèi)容輸出!什么時候調(diào)用了構(gòu)造函數(shù)?我們知道,構(gòu)造函數(shù)在對象被定義時調(diào)用。那么對象anObject是何時被調(diào)用的呢?在主函數(shù)main之前,語句“test anObject”處 47、。
【3.19】
【解】本程序的運行結(jié)果如下:
Con.
Copy con.
default.
【3.20】
【解】
第1個錯誤:printStu()和setSno兩個成員函數(shù)沒有用public定義,不允許外部函數(shù)對對象進行操作。
第2個錯誤:成員函數(shù)在類外定義,應(yīng)加上類名“Student::”。
第3個錯誤:setAge應(yīng)在類中說明,并且在類外定義時,應(yīng)加上類名“Student::”。
【3.21】
【解】
構(gòu)造函數(shù)Point是私有的,語句“Point cpoint;”執(zhí)行時出現(xiàn)錯誤。
【3.22】
【解】 實現(xiàn)本題功能的程序如下:
#include 48、tream>
using namespace std;
class Circle{
public:
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<<"半徑為"< 49、是:
請輸入圓的半徑:3
半徑為3的圓的面積為:28.26
【3.23】
【解】實現(xiàn)本題功能的程序如下:
#include 50、41592*r*r*h;
}
void cylinder::vol()
{ cout<<"volume is:"< 51、t 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<<"日期是:"< 52、
}
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<<"日期是:"< 53、e d2;
d2.SetDate(2010,8,1);
d2.printDate();
Date d3(d1);
d3.printDate();
}
程序的運行結(jié)果是:
日期是:2010年6月8日
日期是:2010年8月1日
日期是:2010年6月8日
3.2 上機實驗題參考解答
【3.1】
(1)
【運行結(jié)果】
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Destructor is calleded
D 54、estructor is calleded
Destructor is calleded
(2)
【運行結(jié)果】
Constructor is Called.
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Destructor is calleded
Destructor is calleded
Destructor is calleded
【結(jié)果分析】
① 創(chuàng)建對象p1時,調(diào)用帶有兩個參數(shù)的構(gòu)造函數(shù),輸出第1行結(jié)果。
② 創(chuàng) 55、建對象p2和p3時,調(diào)用拷貝構(gòu)造函數(shù),輸出第2行和第3行結(jié)果。
③ 當程序運行結(jié)束,釋放對象p3、p2和p1時, 分別調(diào)用析構(gòu)函數(shù)輸出最后3行結(jié)果。
(3)
【錯誤分析】
調(diào)試程序時,發(fā)現(xiàn)添加的兩條語句有錯。這是因為Coordinate類中沒有提供適合創(chuàng)建對象p4和p5的構(gòu)造函數(shù)。為了解決這個問題,可以增加一個默認構(gòu)造函數(shù)和帶一個參數(shù)的構(gòu)造函數(shù),但最簡單的方法是修改帶有兩個參數(shù)的構(gòu)造函數(shù), 使參數(shù)帶有默認值。如:
Coordinate(int x1=0,int y1=0);
這樣,創(chuàng)建對象p4時,2個參數(shù)分別使用默認值0和0;而創(chuàng)建對象p5時, 第1個參數(shù)為2,第2個 56、參數(shù)使用默認值0。
(4)
【運行結(jié)果】
Constructor is Called.
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Constructor is Called.
Constructor is Called.
Destructor is calleded
Destructor is calleded
Destructor is calleded
Destructor is calleded
Destructor 57、is calleded
【結(jié)果分析】
從輸出結(jié)果可以看出,程序調(diào)用了3次構(gòu)造函數(shù),2次拷貝構(gòu)造函數(shù)。
① 創(chuàng)建對象時,將根據(jù)參數(shù)的情況調(diào)用相應(yīng)的構(gòu)造函數(shù)。程序在執(zhí)行語句
Coordinate pl(3,4);
Coordinate p4;
Coordinate p5(2);
創(chuàng)建對象p1、p4和p5時,調(diào)用了3次構(gòu)造函數(shù)。
② 當用類的一個對象去創(chuàng)建該類的另一個對象時,將調(diào)用拷貝構(gòu)造函數(shù)。程序在執(zhí)行
語句
Coordinate p2(p1);
Coordinate p3=p2;
創(chuàng)建對象p2和p3時,調(diào)用了2次拷貝構(gòu)造函數(shù)。
【2.2】
【參考程序】
58、//test3_2.cpp
#include 59、 //顯示魔方成員函數(shù)
private:
int m[4][4];
int step; //相鄰元素之間的差值
int first; //起始值
int sum; //最大元素值和最小元素值的和
};
void magic::getdata() //輸入初值成員函數(shù)
{ cout<<"輸入4*4魔方起始值:";
cin>>first;
cout<<"輸入相鄰元素差值:";
cin>>step;
}
vo 60、id magic::setfirstmagic() //設(shè)置初始魔方成員函數(shù)
{ int i,j;
int tmp;
tmp=first;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{
m[i][j]=tmp;
tmp+=step;
}
}
void magic::generatemagic() //生成最終魔方成員函數(shù)
{ sum=m[0][0]+m[3][3];
for (int i=0,j=0;i<4;i++ 61、,j++)
m[i][j]=sum-m[i][j];
for( i=0,j=3;i<4;i++,j--)
m[i][j]=sum-m[i][j];
}
void magic::printmagic() //顯示魔方成員函數(shù)
{ int i,j;
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
cout< 62、)
{ magic A;
A.getdata();
A.setfirstmagic();
cout<<"初始魔方如下:"< 63、 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 64、ring s[]);
string str[len]={"Germany","Japan","America","Britain","France"};
cout<<"按逆轉(zhuǎn)前的順序輸出字符串:"< 65、)
cout< 66、ce
按逆轉(zhuǎn)后的順序輸出字符串:
France Britain America Japan Germany
第4章 類和對象的進一步討論
4.1 習題參考解答
【4.1】
【解】
所謂對象數(shù)組是指每一數(shù)組元素都是對象的數(shù)組,也就是說,若一個類有若干個對象,我們把這一系列的對象用一個數(shù)組來存放。對象數(shù)組的元素是對象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員。
【4.2】
【解】對象指針就是用于存放對象地址的變量。聲明對象指針的一般語法形式為:
類名* 對象指針名;
【4.3】
【解】B
【4.4】
【解】C
【4.5】
【解】B
說明:
C++中規(guī)定,在建立對象前就可以為靜態(tài)數(shù)據(jù)成員賦值。同時規(guī)定在靜態(tài)成員函數(shù)中不能使用this指針;靜態(tài)成員函數(shù)在類外定義時,不需要用static前綴;靜態(tài)成員函數(shù)既可以在類內(nèi)定義也可以在類外定義。
【4.6】
【解】D
【4.7】
【解】C
【4.8】
【解】D
【4.9】
【解】A
【4.10】
【解】A
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結(jié)
- 2024年小學高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學期小學語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告