面向?qū)ο蟪绦蛟O(shè)計課后習(xí)題答案_第1頁
面向?qū)ο蟪绦蛟O(shè)計課后習(xí)題答案_第2頁
面向?qū)ο蟪绦蛟O(shè)計課后習(xí)題答案_第3頁
面向?qū)ο蟪绦蛟O(shè)計課后習(xí)題答案_第4頁
面向?qū)ο蟪绦蛟O(shè)計課后習(xí)題答案_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

12、便地構(gòu)造出模擬現(xiàn)實問題的實體和操作。2_2下面是一個C程序,改寫它,使它采用C+風(fēng)格的i/o語句改寫如下:#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測試下面的注釋是否有效?此注釋有效,單行注釋中可以嵌套/*.*/方式的注釋。2_4以下簡單的C+程序不可能編譯通過,為什么?原因是:在程序中,當(dāng)一個函數(shù)的定義在后,而對它的調(diào)用在前時,必須將該函數(shù)的原型寫在調(diào)用語句之前,而在本程序中缺少函數(shù)原型語句。在語句:#include <iostream.h>后加上語句sum(int a,int b);就可以通過了。2_5(1)答:這兩個函數(shù)原形是等價的,因為函數(shù)原型中的參數(shù)名可以缺省。(2)答:這兩個

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

15、ndl; 上面程序的運行結(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; 運行結(jié)果為18。2_8答:使用內(nèi)聯(lián)函數(shù)的優(yōu)點主要有兩個:一是能加快代碼的執(zhí)行,減少調(diào)用開銷;二是能消除宏定義的不安全性。2_9 用動態(tài)分配空間的方法計算Fibonacci數(shù)列的前20項并存儲到動態(tài)分配的空間中。答:#include <iostream.h>

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

17、10987 1597 2584 4181 67652_10 建立一個被稱為sroot()的函數(shù),返回其參數(shù)的二次方根。重載sroot()三次,讓它返回整數(shù)、長整數(shù)與雙精度數(shù)的二次方根(計算二次方根時,可以使用標(biāo)準(zhǔn)庫函數(shù)sqrt())#include <iostream.h>#include <math.h>int sroot(int );long sroot(long);double sroot(double);double sqrt();/聲明開方函數(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是長整型double sroot(double d) return sqrt(d); /d是雙精度/敲進9 16 25/輸出3 4 5 習(xí)題2_1

19、1 編寫C+風(fēng)格的程序,解決百錢問題,將一元人民幣兌換成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 編寫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),因為在主函數(shù)中多次調(diào)用它,這樣可以加快代碼執(zhí)行的速度。敲進兩個數(shù):-10 10 結(jié)果:Root is 22_13答:運行結(jié)果是:2 4 6 12 10 說明:本例使用的是返回引用的值,index(3)=12;語句的執(zhí)行實際將a3賦值為12。2_14答:

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

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

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

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

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

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

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

29、:下面是一個計數(shù)器的定義,請完成該類成員函數(shù)的實現(xiàn)#include <iostream.h>class counter public: counter(int number);/構(gòu)造函數(shù) void increment(); /給原值加1 void decrement(); /給原值減1 int getvalue(); /取得計數(shù)器值 int print(); /顯示計數(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()/取得計數(shù)器值 return value; int counter:print()/顯示計數(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ù)注釋語句的提示,實現(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下面定義了一個類date,根據(jù)主程序的提示,實現(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個整數(shù) idate.show(); date indate; /構(gòu)造函數(shù)沒有參數(shù),數(shù)據(jù)通過鍵盤直接輸入 indate.show(); return 0;/解:重載構(gòu)造函數(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ù)時要如:8 回車 9回車 2005回車習(xí)題:3_14建立類cylinder,cylinder的構(gòu)造函數(shù)被傳遞了兩個double值,分別表示圓柱體的半徑和高度。用類cylinder計算圓柱體的體積,并存儲在一個double變量中。在類cylinder中包含一個成員函數(shù)vol(),用來顯示每個cylinder對象的體積。#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建立一個Stock類,含有股票代碼和股票現(xiàn)價兩個數(shù)據(jù)成員。用new自動為Stock類的對象分配內(nèi)存,并將股票代碼“6

37、00001”,現(xiàn)價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; /為對象分配空間 if(!p) /判斷分配是否成功 cout<<"Allocation error." return 1; p->set("600001",8.89);/為對象賦值 p->print(); /顯示對象 delete p; return 0;習(xí)題:3_16聲明一個棧類,利用棧操作實現(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寫反序輸出程序步驟:打開VC系統(tǒng),F(xiàn)ileànewàFileàC+Source Fileà改變路徑Location為本章的路徑àFile處寫文件名à

42、okà開始寫C程序à之后編譯運行#include <stdio.h>#include <string.h>/#include <ctype.h>main() int inverse(char str); /函數(shù)原型說明 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; 第四章:類和對象(二)4_1什么是對象數(shù)組所謂對象數(shù)組是指每一數(shù)組元素都是對象的數(shù)組,也就是說,若一個類有若干個對象,我們把這一系列的對象用一個數(shù)組來存放。對象數(shù)組的元素是對象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員。4_2什么是this指針?它的主要作用是什么?C+為成員函數(shù)提供了一個名字為this的指針,這個指針稱為自引用指針。每當(dāng)創(chuàng)建一個對象時,系統(tǒng)就把this指針初始化為指向該對象

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

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

46、賦值。同時規(guī)定在靜態(tài)成員函數(shù)中不能使用this指針。靜態(tài)成員函數(shù)在類外定義時,不需要用static前綴。靜態(tài)成員函數(shù)即可以在類內(nèi)定義也可以在類外定義4_6在下面有關(guān)友元函數(shù)的描述中,正確的說法是(A)(134)說明:在C+中友元函數(shù)是獨立于當(dāng)前類的外部函數(shù),一個友元函數(shù)可以同時定義為兩個類的友元函數(shù)。友元函數(shù)即可以在類的內(nèi)部也可以在類的外部定義,而在外部定義友元函數(shù)時,不必加關(guān)鍵字friend4_7友元函數(shù)的作用之一是(A)(134)說明:由于友元函數(shù)可以直接訪問對象的私有成員,所以友元的作用是提高程序運行的效率。4_8指出下面程序的錯誤,并說明原因:答案是將其中對應(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”;因為:非靜態(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; /錯誤,y1是調(diào)用const定義的,不能修改 x=y1; int readme() const; / . private: int x;const int y1;int CTest:readme() const int i; i=x; x+; /錯誤,函數(shù)定義用了const,表示該函數(shù)不能修改對象 return x;void main() CTest c(2,8); int i=c.y2; c.y2=i; /錯誤,y2是常量,不能修改 i=c.y1; /錯誤,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); /錯誤。友元函數(shù)不是成員函數(shù),所以不能用this->調(diào)用友/元函數(shù) :friend_f(fri);void main() CT

50、est fri,fri1; fri.friend_f(fri); /錯誤,友元函數(shù)不是成員函數(shù),所以不能用對象.函數(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; /錯誤,不能對this直接賦值 *this.x=10; /錯誤,按優(yōu)先級原句的含義

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

52、after allocation3 objects in existence after deletion說明:這個程序使用靜態(tài)數(shù)據(jù)成員追蹤記載創(chuàng)建對象的個數(shù)。完成這一工作的方法就是每創(chuàng)建一個對象就調(diào)用構(gòu)造函數(shù)一次。每調(diào)用構(gòu)造函數(shù)一次,靜態(tài)數(shù)據(jù)成員total就增加1,每撤消一個對象就調(diào)用析構(gòu)函數(shù)一次。每調(diào)用析構(gòu)函數(shù)一次,靜態(tài)數(shù)據(jù)成員total就減少1。4_15 運行結(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說明:在程序中main()只包括了一個return語句,但竟然有內(nèi)容輸出!什么時候調(diào)用了構(gòu)造函數(shù)?構(gòu)造函數(shù)在對象被定義時調(diào)用。那么對象anObject是何時被調(diào)用的呢?是在main()之前,語句”test anObject”處。因此,anObject的構(gòu)造函數(shù)是先于main()被調(diào)用的。在main()之前的所有全局變量都是在main()開始之前就建立了的。應(yīng)該盡可能避免使用全局變量,因為全局變量有可能引起名稱沖突,使程序的執(zhí)行結(jié)果和預(yù)想的不一樣。 4_16 4_17構(gòu)建一個類book,其中含有2個私有數(shù)據(jù)成員qu和price,建立一個有5個元素的數(shù)組對象,將qu初始化為15,將price初始化為qu的10倍。顯示每個對象的qu*price 答案見下:#include <iostream.h>class

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論