面向?qū)ο蟪绦蛟O(shè)計(jì)課后習(xí)題答案_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課后習(xí)題答案_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課后習(xí)題答案_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課后習(xí)題答案_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課后習(xí)題答案_第5頁(yè)
已閱讀5頁(yè),還剩48頁(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、第一章:面向?qū)ο蟪绦蛟O(shè)計(jì)概述1_1什么是面向?qū)ο蟪绦蛟O(shè)計(jì)?面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新型的程序設(shè)計(jì)范型。這種范型的主要特征是:程序=對(duì)象+消息。面向?qū)ο蟪绦虻幕驹厥菍?duì)象,面向?qū)ο蟪绦虻闹饕Y(jié)構(gòu)特點(diǎn)是:第一:程序一般由類的定義和類的使用兩部分組成,在主程序中定義各對(duì)象并規(guī)定它們之間傳遞消息的規(guī)律。第二:程序中的一切操作都是通過(guò)向?qū)ο蟀l(fā)送消息來(lái)實(shí)現(xiàn)的,對(duì)象接受到消息后,啟動(dòng)有關(guān)方法完成相應(yīng)的操作。面向?qū)ο蟪绦蛟O(shè)計(jì)方法模擬人類習(xí)慣的解題方法,代表了計(jì)算機(jī)程序設(shè)計(jì)新穎的思維方式。這種方法的提出是軟件開(kāi)發(fā)方法的一場(chǎng)革命,是目前解決軟件開(kāi)發(fā)面臨困難的最有希望、最有前途的方法之一。1_2什么是類?什么是對(duì)象

2、?對(duì)象與類的關(guān)系是什么?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)象是描述其屬性的數(shù)據(jù)以及對(duì)這些數(shù)據(jù)施加的一組操作封裝在一起構(gòu)成的統(tǒng)一體。對(duì)象可以認(rèn)為是:數(shù)據(jù)+操作在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類就是具有相同的數(shù)據(jù)和相同的操作的一組對(duì)象的集合,也就是說(shuō),類是對(duì)具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的一類對(duì)象的描述。類和對(duì)象之間的關(guān)系是抽象和具體的關(guān)系。類是多個(gè)對(duì)象進(jìn)行綜合抽象的結(jié)果,一個(gè)對(duì)象是類的一個(gè)實(shí)例。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,總是先聲明類,再由類生成對(duì)象。類是建立對(duì)象的“摸板”,按照這個(gè)摸板所建立的一個(gè)個(gè)具體的對(duì)象,就是類的實(shí)際例子,通常稱為實(shí)例。1_3現(xiàn)實(shí)世界中的對(duì)象有哪些特征?請(qǐng)舉例說(shuō)明。對(duì)象是現(xiàn)實(shí)世界中的一個(gè)實(shí)體,其具有以

3、下一些特征:(1)每一個(gè)對(duì)象必須有一個(gè)名字以區(qū)別于其他對(duì)象。(2)需要用屬性來(lái)描述它的某些特性。(3)有一組操作,每一個(gè)操作決定了對(duì)象的一種行為。(4)對(duì)象的操作可以分為兩類:一類是自身所承受的操作,一類是施加于其他對(duì)象的操作。例如:雇員劉名是一個(gè)對(duì)象 對(duì)象名:劉名對(duì)象的屬性:年齡:36 生日:1966.10.1 工資:2000 部門(mén):人事部 對(duì)象的操作:吃飯 開(kāi)車1_4什么是消息?消息具有什么性質(zhì)?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的請(qǐng)求被稱為“消息”。當(dāng)對(duì)象接收到發(fā)向它的消息時(shí),就調(diào)用有關(guān)的方法,執(zhí)行相應(yīng)的操作。消息是一個(gè)對(duì)象要求另一個(gè)對(duì)象執(zhí)行某個(gè)操作的規(guī)格的說(shuō)明,通過(guò)消息傳遞

4、才能完成對(duì)象之間的相互請(qǐng)求或相互協(xié)作。消息具有以下3個(gè)性質(zhì):(1)同一個(gè)對(duì)象可以接收不同形式的多個(gè)消息,做出不同的響應(yīng)。(2)相同形式的消息可以傳遞給不同的對(duì)象,所做出的響應(yīng)可以是不同的。(3)消息的發(fā)送可以不考慮具體的接收者,對(duì)象可以響應(yīng)消息,也可以不響應(yīng)。1_5什么是方法?消息和方法的關(guān)系是什么?在面向?qū)ο蟪绦蛟O(shè)計(jì)中,要求某一對(duì)象作某一操作時(shí),就向該對(duì)象發(fā)送一個(gè)響應(yīng)的消息,當(dāng)對(duì)象接收到發(fā)向它的消息時(shí),就調(diào)用有關(guān)的方法,執(zhí)行響應(yīng)的操作。方法就是對(duì)象所能執(zhí)行的操作。方法包括界面和方法體兩部分。方法的界面也就是消息的模式,它給出了方法的調(diào)用協(xié)議;方法體則是實(shí)現(xiàn)某種操作的一系列計(jì)算步驟,也就是一段

5、程序。在C+語(yǔ)言中方法是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的,稱為成員函數(shù)。消息和方法的關(guān)系是:對(duì)象根據(jù)接收到的消息,調(diào)用相應(yīng)的方法;反過(guò)來(lái),有了方法,對(duì)象才能響應(yīng)相應(yīng)的消息。1_6什么是封裝和抽象?請(qǐng)舉例說(shuō)明。在現(xiàn)實(shí)世界中,所謂封裝就是把某個(gè)事物包圍起來(lái),使外界不知道該事物的具體內(nèi)容。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,封裝是指把數(shù)據(jù)和實(shí)現(xiàn)操作的代碼集中起來(lái)放在對(duì)象內(nèi)部,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)象好象是一個(gè)不透明的黑盒子,表示對(duì)象屬性的數(shù)據(jù)和實(shí)現(xiàn)各個(gè)操作的代碼都被封裝在黑盒子里,從外面是看不見(jiàn)的,更不能從外面直接訪問(wèn)或修改這些數(shù)據(jù)及代碼。使用一個(gè)對(duì)象的時(shí)候,只需要知道它向外界提供的接口形式而無(wú)需知道它的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和實(shí)

6、現(xiàn)操作的算法。封裝機(jī)制可以將對(duì)象的使用者與設(shè)計(jì)者分開(kāi),使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié),只需要使用設(shè)計(jì)者提供的接口讓對(duì)象去做。抽象是人類認(rèn)識(shí)問(wèn)題的最基本的手段之一。它忽略了一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象是對(duì)復(fù)雜世界的簡(jiǎn)單表示,抽象強(qiáng)調(diào)感興趣的信息,忽略了不重要的信息。例如,設(shè)計(jì)一個(gè)學(xué)籍管理程序的過(guò)程中,考察某個(gè)學(xué)生對(duì)象時(shí),只關(guān)心他的姓名、學(xué)好、成績(jī)等,而對(duì)他的身高、體重等信息就可以忽略。以一般觀點(diǎn)而言,抽象是通過(guò)特定的實(shí)例(對(duì)象)抽象共同性質(zhì)以后形成概念的過(guò)程。抽象是對(duì)系統(tǒng)的簡(jiǎn)化描述或規(guī)范說(shuō)明,它強(qiáng)調(diào)了系統(tǒng)中的一部分細(xì)節(jié)和特性,而忽略了其他部分。

7、抽象包括兩個(gè)方面:數(shù)據(jù)抽象和代碼抽象(或稱為行為抽象)。前者描述某類對(duì)象的屬性或狀況,也就是此類對(duì)象區(qū)別于彼類對(duì)象的特征物理量;后者描述了某類對(duì)象的共同行為特征或具有的共同操作。在面向?qū)ο蟪绦蛟O(shè)計(jì)方法中,對(duì)一個(gè)具體問(wèn)題的抽象分析的結(jié)果,是通過(guò)類來(lái)描述和實(shí)現(xiàn)的?,F(xiàn)在以學(xué)生管理程序?yàn)槔ㄟ^(guò)對(duì)學(xué)生進(jìn)行歸納、分析,抽取出其中的共性,可以得到如下的抽象描述:共同的屬性:姓名、學(xué)號(hào)、成績(jī)等,他們組成了學(xué)生數(shù)據(jù)抽象部分。用C+語(yǔ)言的數(shù)據(jù)成員來(lái)表示,可以是: char *name; int number; float score;共同的行為:數(shù)據(jù)錄入、數(shù)據(jù)修改和數(shù)據(jù)輸出等,這構(gòu)成了學(xué)生的行為抽象部分,用C+

8、語(yǔ)言的成員函數(shù)表示,可以是:input();modify();print(); 如果我們開(kāi)發(fā)一個(gè)學(xué)生健康檔案程序,所關(guān)心的特征就有所不同了??梢?jiàn),即使對(duì)同一個(gè)研究對(duì)象,由于所研究問(wèn)題的側(cè)重點(diǎn)不同,就可能產(chǎn)生不同的抽象結(jié)果。1_7什么是繼承?請(qǐng)舉例說(shuō)明。繼承所表達(dá)的是對(duì)象類之間的相關(guān)關(guān)系,這種關(guān)系使得某類對(duì)象可以繼承另一類對(duì)象的特征和能力?,F(xiàn)實(shí)生活中,繼承是很普遍和容易理解的。例如我們繼承了父母的一些特征,如種族、血型、眼睛的顏色等,父母是我們所具有的屬性的基礎(chǔ)。繼承所表達(dá)的是對(duì)象之間相關(guān)的關(guān)系。這種關(guān)系使得某一類可以繼承另一個(gè)類的特征和能力。1_8若類之間具有繼承關(guān)系,則它們之間具有什么特征?

9、(1)類間具有共享特征(包括數(shù)據(jù)和操作代碼的共享)(2)類間具有差別或新增部分(包括非共享的數(shù)據(jù)和代碼操作)(3)類間具有層次結(jié)構(gòu) 假設(shè)有兩個(gè)類A和B,若類B繼承類A,則類B包含了類A的特征(包括數(shù)據(jù)和操作),同時(shí)也可以加入自己所特有的新特性。這時(shí),我們稱被繼承類A為基類或父類或超類;而稱繼承類B為A類的派生類或子類。同時(shí),我們還可以說(shuō),類B是從類A中派生出來(lái)的。1_9什么是單繼承、多繼承?請(qǐng)舉例說(shuō)明。 從繼承源上分,繼承分為單繼承和多繼承。單繼承是指每個(gè)派生類只直接繼承了一個(gè)基類的特征。多繼承是指多個(gè)基類派生出一個(gè)派生類的繼承關(guān)系。多繼承的派生類直接繼承了不止一個(gè)基類的特征。例如:小孩的玩具

10、車?yán)^承了車的一些特性,還繼承了玩具的一些特征。1_10什么是多態(tài)性?舉例說(shuō)明。 多態(tài)性也是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性。它是指不同的對(duì)象收到相同的消息時(shí)產(chǎn)生不同的行為方式。例如我們同樣雙擊windows系統(tǒng)桌面上的圖標(biāo)時(shí),有的是打開(kāi)多媒體播放器,有的是打開(kāi)資源管理器。利用多態(tài)性,用戶只需發(fā)送一般形式的消息,而將所有的實(shí)現(xiàn)留給接收消息的對(duì)象。對(duì)象根據(jù)所收到的消息做出相應(yīng)的動(dòng)作。1_11什么是函數(shù)重載和運(yùn)算符重載?為什么要使用重載? 重載一般包括函數(shù)重載和運(yùn)算符重載。函數(shù)重載是指一個(gè)表示符可同時(shí)用于為多個(gè)函數(shù)命名,而運(yùn)算符重載是指一個(gè)運(yùn)算符可同時(shí)用于多種運(yùn)算。也就是說(shuō),相同名字的函數(shù)或運(yùn)算符在不同的

11、場(chǎng)合可以表現(xiàn)出不同的行為。 使用重載的目的是為了更好地表達(dá)行為共享,這種行為共享就象將相似的操作劃分在一起。使用重載可以使程序員在只知道操作的一般含義,而不知道操作的具體細(xì)節(jié)的情況下能正確地對(duì)某個(gè)對(duì)象使用一個(gè)操作。另外,使用重載的直接益處是減少了程序員記憶操作的名字的負(fù)擔(dān)。第二章::C+基礎(chǔ)2_1簡(jiǎn)述C+的主要特點(diǎn)(1)C+保持與C的兼容,用C編寫(xiě)的軟件可以用到C+中。(2)用C+編寫(xiě)的程序可讀性好,代碼結(jié)構(gòu)更合理,可直接地在程序中映射問(wèn)題空間的結(jié)構(gòu)。(3)生成代碼的質(zhì)量高。(4)軟件的可重用性、可擴(kuò)充性、可維護(hù)性和可靠性有了明顯的提高,從而節(jié)省了開(kāi)發(fā)費(fèi)用和時(shí)間。(5)支持面向?qū)ο蟮臋C(jī)制,可方

12、便地構(gòu)造出模擬現(xiàn)實(shí)問(wèn)題的實(shí)體和操作。2_2下面是一個(gè)C程序,改寫(xiě)它,使它采用C+風(fēng)格的i/o語(yǔ)句改寫(xiě)如下:#include <iostream.h>main() int a,b,d,min;cout<<”enter two numbers: “;cin>>a;cin>>b;min=a>b?b:a;for(d=2;d<min;d+)if(a%b)=0)&&(b%d)=0) break;if(d=min) cout<<”no common denominatorsn”;return 0; cout<<

13、;”the lowest common denominator is “<<endl<<d; return 0;2_3測(cè)試下面的注釋是否有效?此注釋有效,單行注釋中可以嵌套/*.*/方式的注釋。2_4以下簡(jiǎn)單的C+程序不可能編譯通過(guò),為什么?原因是:在程序中,當(dāng)一個(gè)函數(shù)的定義在后,而對(duì)它的調(diào)用在前時(shí),必須將該函數(shù)的原型寫(xiě)在調(diào)用語(yǔ)句之前,而在本程序中缺少函數(shù)原型語(yǔ)句。在語(yǔ)句:#include <iostream.h>后加上語(yǔ)句sum(int a,int b);就可以通過(guò)了。2_5(1)答:這兩個(gè)函數(shù)原形是等價(jià)的,因?yàn)楹瘮?shù)原型中的參數(shù)名可以缺省。(2)答:這兩個(gè)

14、函數(shù)的第一行是不等價(jià)的,函數(shù)的第一行中必須包含參數(shù)名。(3)答:這兩個(gè)函數(shù)原型是等價(jià)的,因?yàn)樵诤瘮?shù)原型中未注明參數(shù),C+認(rèn)為該函數(shù)的參數(shù)表為空(void)2_6答:輸出結(jié)果為:10 20 因?yàn)閒函數(shù)的參數(shù)是引用,所以修改k的值有效。函數(shù)調(diào)用后,主函數(shù)中k的值變?yōu)?0。由于m是對(duì)函數(shù)的引用,當(dāng)m被賦值為20時(shí),k的值也變?yōu)?0。2_7 舉例說(shuō)明可以使用const替代#define以消除#define的不安全性答:例如:#include <iostream.h> #define A 2+4 #define B A*3 void main() cout<<B<<e

15、ndl; 上面程序的運(yùn)行結(jié)果是14而不是18,但很容易被認(rèn)為是18。用const替代#define就能得到正確結(jié)果,從而消除了#define的不安全性。#include <iostream.h>const A=2+4;const B=A*3; void main() cout<<B<<endl; 運(yùn)行結(jié)果為18。2_8答:使用內(nèi)聯(lián)函數(shù)的優(yōu)點(diǎn)主要有兩個(gè):一是能加快代碼的執(zhí)行,減少調(diào)用開(kāi)銷;二是能消除宏定義的不安全性。2_9 用動(dòng)態(tài)分配空間的方法計(jì)算Fibonacci數(shù)列的前20項(xiàng)并存儲(chǔ)到動(dòng)態(tài)分配的空間中。答:#include <iostream.h>

16、; #include “stdio.h”void main() int I,*p=new int20;/動(dòng)態(tài)分配20個(gè)整型空間 *p=1;*(p+1)=1;/前面兩個(gè)空間賦值1cout<<*p<<”t”<<*(p+1)<<”t”;p=p+2;/p指向第三個(gè)空間for(i=3;i<=20;i+) *p=*(p-1)+*(p-2); cout<<*p<<”t”; if(i%5=0) cout<<endl; p+;/指向下一個(gè)空間結(jié)果:1 1 2 3 58 13 21 34 5589 144 233 377 6

17、10987 1597 2584 4181 67652_10 建立一個(gè)被稱為sroot()的函數(shù),返回其參數(shù)的二次方根。重載sroot()三次,讓它返回整數(shù)、長(zhǎng)整數(shù)與雙精度數(shù)的二次方根(計(jì)算二次方根時(shí),可以使用標(biāo)準(zhǔn)庫(kù)函數(shù)sqrt())#include <iostream.h>#include <math.h>int sroot(int );long sroot(long);double sroot(double);double sqrt();/聲明開(kāi)方函數(shù)sqrt()void main() int i,x;long l,y;double d,z; cin>>i

18、; cin>>l; cin>>d; x=sroot(i); y=sroot(l); z=sroot(d); cout<<x<<"t"<<y<<"t"<<z<<endl;int sroot(int i) return sqrt(i); /i是整數(shù)long sroot(long l) return sqrt(l); /l是長(zhǎng)整型double sroot(double d) return sqrt(d); /d是雙精度/敲進(jìn)9 16 25/輸出3 4 5 習(xí)題2_1

19、1 編寫(xiě)C+風(fēng)格的程序,解決百錢(qián)問(wèn)題,將一元人民幣兌換成1、2、5分的硬幣,有多少種換法?#include <iostream.h>void main() int i,j,sum=0; for(i=0;i<=20;i+) for(j=0;j<=50;j+) if(100-5*i-2*j>=0) sum+; cout<<100-5*i-2*j<<”t”<<j<<”t”<<i<<endl;cout<<”sum is “<<sum<<endl;習(xí)題2_12 編寫(xiě)C

20、+風(fēng)格的程序,用二分法求解f(x)=0的根#include <iostream.h>#include <math.h>inline float f(float x) return 2*x*x*x-4*x*x+3*x-6; void main() float left,right,middle,ym,yl,yr; cout<<”pleass two number:”<<endl;/接受輸入,確定第一組數(shù)據(jù)區(qū)域 cin>>left>>right; yl=f(left); yr=f(right);do middle=(right

21、+left)/2; ym=f(middle); if(yr*ym>0) right=middle; Yr=ym; else left=middle; yl=ym; while(fabs(ym)>=1e-6);cout<<”nRoot is:”<<middle<<endl;本例使用了內(nèi)聯(lián)函數(shù)f(x),因?yàn)樵谥骱瘮?shù)中多次調(diào)用它,這樣可以加快代碼執(zhí)行的速度。敲進(jìn)兩個(gè)數(shù):-10 10 結(jié)果:Root is 22_13答:運(yùn)行結(jié)果是:2 4 6 12 10 說(shuō)明:本例使用的是返回引用的值,index(3)=12;語(yǔ)句的執(zhí)行實(shí)際將a3賦值為12。2_14答:

22、運(yùn)行結(jié)果為:101 說(shuō)明:在語(yǔ)句:i=i+1;中賦值號(hào)左邊:i的i單元是全局變量,賦值號(hào)右邊的i單元是局部變量i。所以執(zhí)行該語(yǔ)句的結(jié)果是將局部變量i的值+1(101)賦值給全局變量i2_15答:結(jié)果是:10 10 說(shuō)明:函數(shù)f(&a,b)中的第一個(gè)參數(shù)是引用,引用參數(shù)是一種按地址傳遞參數(shù)的方法,對(duì)其的調(diào)用是傳地址調(diào)用;而第二個(gè)參數(shù)是變量參數(shù),對(duì)它的調(diào)用是通常的傳值調(diào)用。所以運(yùn)行后,a的值被改為10,b的值不變,仍為102_16答:D 說(shuō)明:int *p=new int(10);表示分配1個(gè)整型空間,初值為10 int *p=new int10;表示分配10個(gè)整型空間 int *p=ne

23、w int;表示分配1個(gè)整型空間 int *p=new int10(0)想給一個(gè)數(shù)組分配內(nèi)存空間時(shí),對(duì)整個(gè)數(shù)組進(jìn)行初始化,這是不允許的。 2_17答:D 說(shuō)明:name被定義為指向常量的常指針,所以它所指的內(nèi)容和本身的內(nèi)容都不能修改,而name3=a;修改了name所指的常量,name=lin;和name=new char5;修改了常指針,只有D輸出一個(gè)字符是正確的。2_18答:A 說(shuō)明:name被定義指向常量的指針,這是一個(gè)不能移動(dòng)的固定指針,它所指的內(nèi)容不能改變,但指針?biāo)傅臄?shù)據(jù)可以改變,而name3=q;修改了name所指的內(nèi)容,是正確的。name=”lin”; name=new cha

24、r5; name=new char(q);以不同的方法修改了常指針,都是錯(cuò)誤的。2_19答:A 說(shuō)明:name被定義指向常量的指針,不允許改變指針?biāo)傅某A?,但指針本身的?nèi)容可以修改,而name3=q;修改了name所指的內(nèi)容,是錯(cuò)誤的。name=”lin” name=new char5;和name=new char(q)以不同的方法修改了常指針,都是正確的。2_20答:D 說(shuō)明:C+中不能建立引用數(shù)組和指向引用的指針,也不能建立引用的引用。所以A、B、C是錯(cuò)誤的,D是正確的。第三章:類和對(duì)象(一)3_1答:類聲明的一般格式如下:class 類名 public: 公有數(shù)據(jù)成員; 公有成員函數(shù);

25、 protected: 保護(hù)數(shù)據(jù)成員; 保護(hù)成員函數(shù); private: 私有數(shù)據(jù)成員; 私有成員函數(shù);其中:class是聲明類的關(guān)鍵字;類名是要聲明的類的名字;后面的花括號(hào)表示出類聲明的范圍;最后的分號(hào)表示類聲明結(jié)束。3_2答:構(gòu)造函數(shù)是一種特殊的成員函數(shù),它主要用于為對(duì)象分配空間,進(jìn)行初始化。構(gòu)造函數(shù)具有一些特殊的性質(zhì):(1)構(gòu)造函數(shù)的名字必須與類名相同(2)構(gòu)造函數(shù)可以有任意類型的參數(shù),但不能指定返回類型。它有隱含的返回值,該值在系統(tǒng)內(nèi)部使用。(3)構(gòu)造函數(shù)是特殊的成員函數(shù),函數(shù)體可寫(xiě)在類體內(nèi),也可寫(xiě)在類體外。(4)構(gòu)造函數(shù)可以重載,即一個(gè)類中可以定義多個(gè)參數(shù)個(gè)數(shù)或參數(shù)類型不同的構(gòu)造函數(shù)

26、。(5)構(gòu)造函數(shù)被聲明為公有函數(shù),但它不能象其它成員函數(shù)那樣被顯示地調(diào)用,它是在定義對(duì)象的同時(shí)被調(diào)用的。析構(gòu)函數(shù)也是一種特殊的成員函數(shù)。它執(zhí)行與構(gòu)造函數(shù)相反的操作,通常用于撤消對(duì)象時(shí)的一些清理任務(wù),如釋放分配給對(duì)象的內(nèi)存空間等。析構(gòu)函數(shù)有以下一些特點(diǎn):(1)析構(gòu)函數(shù)與構(gòu)造函數(shù)名字相同,但它前面必須加一個(gè)波浪號(hào)()(2)析構(gòu)函數(shù)沒(méi)有參數(shù),不能指定返回類型,而且不能重載。因此在一個(gè)類中只能有一個(gè)析構(gòu)函數(shù)。(3)當(dāng)撤消對(duì)象時(shí),編譯系統(tǒng)會(huì)自動(dòng)地調(diào)用析構(gòu)函數(shù)。3_3答:B 說(shuō)明:C+中對(duì)構(gòu)造函數(shù)有一些規(guī)定:不能帶返回值;可以不帶參數(shù);也可以缺省定義;但構(gòu)造函數(shù)的名字與類名必須完全相同。3_4答:C 說(shuō)明

27、:C+中沒(méi)有限定private、public、protected的書(shū)寫(xiě)次序。但是,不能在類的聲明中給數(shù)據(jù)成員賦初值,數(shù)據(jù)成員的數(shù)據(jù)類型也不能是register(寄存器類型),沒(méi)有用private、public、protected定義的數(shù)據(jù)成員是私有成員。3_5答:C 說(shuō)明:C+中對(duì)析構(gòu)函數(shù)也有一些規(guī)定:沒(méi)有參數(shù);不能重載;析構(gòu)函數(shù)的名字是在類名前加“”;析構(gòu)函數(shù)不能指定返回類型。3_6答:B 說(shuō)明:構(gòu)造函數(shù)的工作是在創(chuàng)建對(duì)象時(shí)執(zhí)行的。3_27答:語(yǔ)句”p1.age=30;”出現(xiàn)錯(cuò)誤。因?yàn)閍ge是私有數(shù)據(jù)成員,不能直接訪問(wèn)。3_28答:第1個(gè)錯(cuò)誤:printStu、setSno兩個(gè)成員函數(shù)沒(méi)有用

28、public定義,則不允許外部函數(shù)對(duì)對(duì)象進(jìn)行操作。第2個(gè)錯(cuò)誤:成員函數(shù)在類外定義,應(yīng)加上類名“Student:”。第3個(gè)錯(cuò)誤:setAge應(yīng)在類中說(shuō)明,并且在類外定義時(shí),應(yīng)加上類名”Student:”。3_29答:語(yǔ)句”P(pán)oint cpoint;”是錯(cuò)誤的,它試圖用私有的構(gòu)造函數(shù)Point訪問(wèn)公有數(shù)據(jù)成員x和y,這是不對(duì)的。3_10答:語(yǔ)句Stack stt;”應(yīng)該帶參數(shù),因?yàn)楫?dāng)類中沒(méi)有定義構(gòu)造函數(shù)時(shí),編譯器會(huì)自動(dòng)生成一個(gè)缺省的不帶參數(shù)的構(gòu)造函數(shù)。但是,如果類中有自己定義的構(gòu)造函數(shù)后,編譯器將不再自動(dòng)生成一個(gè)缺省的構(gòu)造函數(shù)。例如:將上述語(yǔ)句改成“Stack stt(10);”就正確了。3_30

29、:下面是一個(gè)計(jì)數(shù)器的定義,請(qǐng)完成該類成員函數(shù)的實(shí)現(xiàn)#include <iostream.h>class counter public: counter(int number);/構(gòu)造函數(shù) void increment(); /給原值加1 void decrement(); /給原值減1 int getvalue(); /取得計(jì)數(shù)器值 int print(); /顯示計(jì)數(shù) private: int value;counter:counter(int number)/構(gòu)造函數(shù)定義 value=number; void counter:increment()/給原值加1 value+;

30、void counter:decrement()/給原值減1 value-; int counter:getvalue()/取得計(jì)數(shù)器值 return value; int counter:print()/顯示計(jì)數(shù) cout<<"value is "<<value<<endl; return 0; main() int i; cin>>i; counter a(0); for(int j=0;j<i;j+) a.increment(); a.getvalue(); a.print(); counter b(10); fo

31、r(int k=1;k<i;k+) b.decrement(); b.getvalue(); b.print(); return 0; 習(xí)題:3_31根據(jù)注釋語(yǔ)句的提示,實(shí)現(xiàn)類Date的成員函數(shù)#include <iostream.h>class Date public: void printDate(); /顯示日期 void setDay(int d);/設(shè)置日期值 void setMonth(int m);/設(shè)置月的值 void setYear(int y);/設(shè)置年的值private: int day,month,year;void main() Date testD

32、ay; testDay.setDay(5); testDay.setMonth(10); testDay.setYear(2003); testDay.printDate();void Date:printDate() cout<<"nDate is "<<year<<"." cout<<month<<"."<<day<<endl;void Date:setDay(int d) day=d; void Date:setMonth(int m) mont

33、h=m; void Date:setYear(int y) year=y; 習(xí)題:3_13下面定義了一個(gè)類date,根據(jù)主程序的提示,實(shí)現(xiàn)重載構(gòu)造函數(shù)date()#include <iostream.h>#include <stdio.h>class date public: date(int d,int m,int y); date:date(); void show();private: int day,month,year;void date:show() cout<<day<<'/'<<month<<

34、;'/' cout<<year<<"n"main() date idate(28,10,1949);/構(gòu)造函數(shù)的參數(shù)為3個(gè)整數(shù) idate.show(); date indate; /構(gòu)造函數(shù)沒(méi)有參數(shù),數(shù)據(jù)通過(guò)鍵盤(pán)直接輸入 indate.show(); return 0;/解:重載構(gòu)造函數(shù)的實(shí)現(xiàn)如下:date:date(int d,int m,int y) day=d; month=m; year=y;date:date() cout<<"Enter month_day_year:n" cin>&

35、gt;day; cin>>month; cin>>year;/注意:敲數(shù)據(jù)時(shí)要如:8 回車 9回車 2005回車習(xí)題:3_14建立類cylinder,cylinder的構(gòu)造函數(shù)被傳遞了兩個(gè)double值,分別表示圓柱體的半徑和高度。用類cylinder計(jì)算圓柱體的體積,并存儲(chǔ)在一個(gè)double變量中。在類cylinder中包含一個(gè)成員函數(shù)vol(),用來(lái)顯示每個(gè)cylinder對(duì)象的體積。#include <iostream.h>class cylinder public: cylinder(double a,double b); void vol();pr

36、ivate: 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" void main() cylinder x(2.2,8.09); x.vol();習(xí)題:3_15建立一個(gè)Stock類,含有股票代碼和股票現(xiàn)價(jià)兩個(gè)數(shù)據(jù)成員。用new自動(dòng)為Stock類的對(duì)象分配內(nèi)存,并將股票代碼“6

37、00001”,現(xiàn)價(jià)8.89存入內(nèi)存的相應(yīng)域中。#include <iostream.h>#include <string.h>class Stock public: void set(char *c,float pr); void print();private: char Stockcode7; float price;void Stock:set(char *c,float pr) strcpy(Stockcode,c); price=pr;void Stock:print() cout<<Stockcode<<": "&

38、lt;<price; cout<<"n"main() Stock *p; p=new Stock; /為對(duì)象分配空間 if(!p) /判斷分配是否成功 cout<<"Allocation error." return 1; p->set("600001",8.89);/為對(duì)象賦值 p->print(); /顯示對(duì)象 delete p; return 0;習(xí)題:3_16聲明一個(gè)棧類,利用棧操作實(shí)現(xiàn)將輸入字符串反向輸出的功能#include <iostream.h>/#include

39、<iomanip.h>/#include <ctype.h>#include <string.h>const int SIZE=10;class stack public: stack() /構(gòu)造函數(shù) tos=0; void push(char ch);/將數(shù)據(jù)ch壓入棧 char pop(); /將棧頂數(shù)據(jù)彈出棧 char stckSIZE; /數(shù)組,用于存放棧中數(shù)據(jù)SIZE上面賦值為10 int tos; /棧頂位置(數(shù)組下標(biāo));/stack:stack() /構(gòu)造函數(shù),初始化棧/ tos=0; void stack:push(char ch)/壓入棧

40、if(tos=SIZE) cout<<"Stack is full"/棧是滿的 return; stcktos=ch; tos+;char stack:pop()/彈出棧 if(tos=0) cout<<"Stack is empty"/棧是空的 return 0; tos-; return stcktos;void main() int i; char str20; char re_str20; cout<<"nplease input a string: " cin>>str; st

41、ack ss; for(i=0;i<strlen(str);i+) ss.push(stri); for(i=0;i<strlen(str);i+) re_stri=ss.pop(); re_stri='0' cout<<"nreverse string: " cout<<re_str<<endl;附:用C寫(xiě)反序輸出程序步驟:打開(kāi)VC系統(tǒng),F(xiàn)ileànewàFileàC+Source Fileà改變路徑Location為本章的路徑àFile處寫(xiě)文件名à

42、okà開(kāi)始寫(xiě)C程序à之后編譯運(yùn)行#include <stdio.h>#include <string.h>/#include <ctype.h>main() int inverse(char str); /函數(shù)原型說(shuō)明 char str100; printf("Input string: "); scanf("%s",str); inverse(str); printf("Inverse string: %sn",str);int inverse(char str) /函數(shù)定義

43、char t; int i,j; for(i=0,j=strlen(str);i<strlen(str)/2;i+,j-) t=stri; stri=strj-1; strj-1=t; return 0; 第四章:類和對(duì)象(二)4_1什么是對(duì)象數(shù)組所謂對(duì)象數(shù)組是指每一數(shù)組元素都是對(duì)象的數(shù)組,也就是說(shuō),若一個(gè)類有若干個(gè)對(duì)象,我們把這一系列的對(duì)象用一個(gè)數(shù)組來(lái)存放。對(duì)象數(shù)組的元素是對(duì)象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員。4_2什么是this指針?它的主要作用是什么?C+為成員函數(shù)提供了一個(gè)名字為this的指針,這個(gè)指針?lè)Q為自引用指針。每當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)就把this指針初始化為指向該對(duì)象

44、。每當(dāng)調(diào)用一個(gè)成員函數(shù)時(shí),系統(tǒng)就自動(dòng)把this指針作為一個(gè)隱含的參數(shù)傳給該函數(shù)。不同的對(duì)象調(diào)用同一個(gè)成員函數(shù)時(shí),C+編譯器將根據(jù)成員函數(shù)的this指針?biāo)赶虻膶?duì)象來(lái)確定應(yīng)該引用哪一個(gè)對(duì)象的數(shù)據(jù)成員。4_3友元函數(shù)有什么作用?友元函數(shù)不是當(dāng)前類的成員函數(shù),而是獨(dú)立于當(dāng)前類的外部函數(shù),但它可以訪問(wèn)該類的所有對(duì)象的成員,包括私有成員和公有成員。通過(guò)友元函數(shù)可以在不放棄私有數(shù)據(jù)安全的情況下,使得類外部的函數(shù)能夠訪問(wèn)類中的私有成員。當(dāng)一個(gè)函數(shù)需要訪問(wèn)多個(gè)類時(shí),友元函數(shù)非常有用,普通的成員函數(shù)只能訪問(wèn)其所屬的類,但是多個(gè)類的友元函數(shù)能夠訪問(wèn)相應(yīng)的所有類的數(shù)據(jù)。此外,在某些情況,例如運(yùn)算符被重載時(shí),需要用到

45、友元函數(shù)。4_4假設(shè)在程序中已經(jīng)聲明了類point,并建立了其對(duì)象p1和p2。請(qǐng)回答以下幾個(gè)語(yǔ)句有什么區(qū)別?(1)point p1,p2; 用帶缺省參數(shù)的構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),定義了point類的2個(gè)對(duì)象p1和p2。(2)point p2=p1; 依據(jù)已存在的對(duì)象p1,用賦值形式調(diào)用拷貝構(gòu)造函數(shù),創(chuàng)建對(duì)象p2。(3)point p2(p1); 依據(jù)已存在的對(duì)象p1,用顯示調(diào)用拷貝構(gòu)造函數(shù),創(chuàng)建對(duì)象p2(4)p2=p1; 對(duì)象賦值語(yǔ)句,將對(duì)象p1數(shù)據(jù)成員的值拷貝到對(duì)象p2中。4_5在下面有關(guān)靜態(tài)成員函數(shù)的描述中,正確的是(B)見(jiàn)書(shū)133頁(yè)說(shuō)明:C+中規(guī)定在建立對(duì)象前,就可以為靜態(tài)數(shù)據(jù)成員

46、賦值。同時(shí)規(guī)定在靜態(tài)成員函數(shù)中不能使用this指針。靜態(tài)成員函數(shù)在類外定義時(shí),不需要用static前綴。靜態(tài)成員函數(shù)即可以在類內(nèi)定義也可以在類外定義4_6在下面有關(guān)友元函數(shù)的描述中,正確的說(shuō)法是(A)(134)說(shuō)明:在C+中友元函數(shù)是獨(dú)立于當(dāng)前類的外部函數(shù),一個(gè)友元函數(shù)可以同時(shí)定義為兩個(gè)類的友元函數(shù)。友元函數(shù)即可以在類的內(nèi)部也可以在類的外部定義,而在外部定義友元函數(shù)時(shí),不必加關(guān)鍵字friend4_7友元函數(shù)的作用之一是(A)(134)說(shuō)明:由于友元函數(shù)可以直接訪問(wèn)對(duì)象的私有成員,所以友元的作用是提高程序運(yùn)行的效率。4_8指出下面程序的錯(cuò)誤,并說(shuō)明原因:答案是將其中對(duì)應(yīng)的2條改成:cout<

47、;<Student:get_x()<<”Studet exist,y=”<<stu1.get_Sno()<<”n”;cout<<Student:get_x()<<”Studet exist,y=”<<pstu->get_sno()<<”n”;因?yàn)椋悍庆o態(tài)成員函數(shù)的調(diào)用方法與靜態(tài)成員函數(shù)的調(diào)用方法不同。4_9答:#include <iostream.h>#include <stdlib.h>class CTest public: const int y2; CTest(int

48、i1,int i2):y1(i1),y2(i2) y1=10; /錯(cuò)誤,y1是調(diào)用const定義的,不能修改 x=y1; int readme() const; / . private: int x;const int y1;int CTest:readme() const int i; i=x; x+; /錯(cuò)誤,函數(shù)定義用了const,表示該函數(shù)不能修改對(duì)象 return x;void main() CTest c(2,8); int i=c.y2; c.y2=i; /錯(cuò)誤,y2是常量,不能修改 i=c.y1; /錯(cuò)誤,y1是私有變量,不能直接存取4_10答:#include <ios

49、tream.h>#include <stdlib.h>class CTest public: CTest () x=20; void use_friend(); private: int x; friend void friend_f(CTest fri); ;void friend_f(CTest fri) fri.x=55; void CTest:use_friend() CTest fri; this->friend_f(fri); /錯(cuò)誤。友元函數(shù)不是成員函數(shù),所以不能用this->調(diào)用友/元函數(shù) :friend_f(fri);void main() CT

50、est fri,fri1; fri.friend_f(fri); /錯(cuò)誤,友元函數(shù)不是成員函數(shù),所以不能用對(duì)象.函數(shù)名調(diào)/用友元函數(shù) friend_f(fri1);4_11答:#include <iostream.h>#include <stdlib.h>class CTest public: CTest() x=20; void use_this(); private: int x;void CTest:use_this() CTest y,*pointer; this=&y; /錯(cuò)誤,不能對(duì)this直接賦值 *this.x=10; /錯(cuò)誤,按優(yōu)先級(jí)原句的含義

51、是*(this.x)=10,顯然不對(duì),正確的寫(xiě)/法是(*this).x=10;或this->x=10;pointer=this;pointer=&y;void main() CTest y; this->x=235; /錯(cuò)誤,this的引用不能在外部函數(shù)中,只能在內(nèi)部函數(shù)中。4_12答:運(yùn)行結(jié)果是:10,2030,4850,6870,8090,1611,1204_13答:運(yùn)行結(jié)果是:Constructing10Destructing.100Destructing4_14答:運(yùn)行結(jié)果是:3 objects in existence4 objects in existence

52、after allocation3 objects in existence after deletion說(shuō)明:這個(gè)程序使用靜態(tài)數(shù)據(jù)成員追蹤記載創(chuàng)建對(duì)象的個(gè)數(shù)。完成這一工作的方法就是每創(chuàng)建一個(gè)對(duì)象就調(diào)用構(gòu)造函數(shù)一次。每調(diào)用構(gòu)造函數(shù)一次,靜態(tài)數(shù)據(jù)成員total就增加1,每撤消一個(gè)對(duì)象就調(diào)用析構(gòu)函數(shù)一次。每調(diào)用析構(gòu)函數(shù)一次,靜態(tài)數(shù)據(jù)成員total就減少1。4_15 運(yùn)行結(jié)果是:Heres the program output.Lets generate some stuffCounting at 0Counting at 1Counting at 2Counting at 3Counting at

53、 4Counting at 5Counting at 6Counting at 7Counting at 8Counting at 9說(shuō)明:在程序中main()只包括了一個(gè)return語(yǔ)句,但竟然有內(nèi)容輸出!什么時(shí)候調(diào)用了構(gòu)造函數(shù)?構(gòu)造函數(shù)在對(duì)象被定義時(shí)調(diào)用。那么對(duì)象anObject是何時(shí)被調(diào)用的呢?是在main()之前,語(yǔ)句”test anObject”處。因此,anObject的構(gòu)造函數(shù)是先于main()被調(diào)用的。在main()之前的所有全局變量都是在main()開(kāi)始之前就建立了的。應(yīng)該盡可能避免使用全局變量,因?yàn)槿肿兞坑锌赡芤鹈Q沖突,使程序的執(zhí)行結(jié)果和預(yù)想的不一樣。 4_16 4_17構(gòu)建一個(gè)類book,其中含有2個(gè)私有數(shù)據(jù)成員qu和price,建立一個(gè)有5個(gè)元素的數(shù)組對(duì)象,將qu初始化為15,將price初始化為qu的10倍。顯示每個(gè)對(duì)象的qu*price 答案見(jiàn)下:#include <iostream.h>class

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論