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

下載本文檔

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

文檔簡介

1、精選文檔1 面對對象程序設(shè)計中的數(shù)據(jù)隱蔽指的是參考答案為:DA輸入數(shù)據(jù)必需輸入保密口令B數(shù)據(jù)經(jīng)過加密處理C. 對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)上建有防火墻D對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的不行訪問性解析輸入數(shù)據(jù)必需輸入保密口令和數(shù)據(jù)經(jīng)過加密處理都不是面對對象程序設(shè)計的特征;對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)上也不行能建有防火墻,所以它們都不是面對對象程序設(shè)計中所指的數(shù)據(jù)隱蔽。面對對象程序設(shè)計系統(tǒng)中的封裝單位是對象,對象之間只能通過接口進行信息溝通,外部不能對對象中的數(shù)據(jù)任憑地進行訪問,這就造成了對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的不行訪問性,也使得數(shù)據(jù)被隱蔽在對象中。這就是面對對象程序設(shè)計中的數(shù)據(jù)隱蔽所指。2 下列各項中符合函數(shù)重載必需滿足的條件的是參考答案

2、為:DA 必需有不同的參數(shù)個數(shù)B對應(yīng)的參數(shù)類型必需不相同C. A和B必需同時滿足DA和B只要滿足一個即可解析我們知道,在同一個作用域中,要實現(xiàn)函數(shù)重載必需滿足的條件的是: 有不同的參數(shù)個數(shù);或者 對應(yīng)的參數(shù)有不相同的數(shù)據(jù)類型,即和中只要有一個滿足就可以了。當然兩者都滿足更好,但這不是必需的。3下列帶缺省值參數(shù)的函數(shù)說明中,正確的說明是參考答案為:AAint Fun(int x,int y=2,int z=3);Bint Fun(int x=1,int y,int z=3);C. int Fun(int x,int y=2,int z);Dint Fun(int x=1,int y,int z=

3、3);解析在帶缺省值參數(shù)的函數(shù)說明中,正確的說明應(yīng)當是無缺省值的參數(shù)依次排列在參數(shù)表的左邊,排完無缺省值的參數(shù)后,再依次排列帶缺省值的參數(shù)。從所給出的四個選項來看,只有“int Fun(int x,int y=2,int z=3)”符合這條規(guī)定,其它的都不符合。4有如下的對類“CSample”的說明,其中( )是錯誤的。 class CSample 參考答案為:AAint a=23;BCSample();public:CCSample(int val);D CSample();解析在上面對類“CSample”說明中,“CSample()”和“CSample(int val)”是該類重載的構(gòu)造函

4、數(shù)、“ CSample()”是該類的析構(gòu)函數(shù),這三個語句都是正確的。錯誤的語句是“int a=23”,由于它違反了在類的聲明(不管是引用性聲明,還是定義性聲明)中都不能以賦值表達式的形式給它的數(shù)據(jù)成員進行初始化。5已知類A中的一個成員函數(shù)的說明如下:void Set(A &a);則該函數(shù)的參數(shù)“A &a”的含義是參考答案為:CA指向A的指針為aB將變量a的地址賦給類AC類A對象引用a用作函數(shù)的形參D變量A與a按位與后作函數(shù)參數(shù)解析由于A是一個類,所以“A &a”表示a是類A的對象,但由于對象a的前綴了符號“&”,則“&a”表示是類A的對象引用。所以“A

5、&a”的含義是類A對象引用a用作函數(shù)的形參。6若類A和類B的定義如下:class A public:int i,j;void get();class B:A int i,j;protected:int k;public: void make();void B:make() k=i*j; 則其中()是非法的表達式。參考答案為:DAvoid get();Bint k;Cvoid make();Dk=i*j;解析對于給定的四項中,前三項都是正確的,只有第四項是錯誤的。由于,類B是類A的私有派生類(缺省訪問類型),所以A中的公類型的數(shù)據(jù)成員在類B中成為了私有數(shù)據(jù)成員,但函數(shù)“void B:ma

6、ke()”既然是類B的成員函數(shù),則既可訪問類A中的公有數(shù)據(jù)成員,也能訪問類B中的私有數(shù)據(jù)成員,則表達式“k=i*j;”造成了訪問的二義性,即其中的i和j,到底是取自類A呢?還是取自類B呢?7下面的主程序中,語句( )是錯誤的。class A int i;public:virtual void fun()=0;A(int a) i=a; ;class B int j;public:void fun() cout<<”B:fun()n”; B(int b,int c) :A(b) j=c; ;void main()參考答案為:AA A a(5);BA *pa;CB b(7);DB *p

7、b;解析在類A中,函數(shù)“virtual void fun()=0”為純虛函數(shù),因此,類A為抽象類。作為抽象類,它是不能被用來定義具體對象的,而語句“A a(5);”恰恰是定義抽象類的對象的,所以它是錯誤的8拷貝(復制)構(gòu)造函數(shù)的作用是參考答案為:CA進行數(shù)據(jù)類型的轉(zhuǎn)換B用對象調(diào)用成員函數(shù)C用對象初始化對象D用一般類型的數(shù)據(jù)初始化對象解析進行數(shù)據(jù)類型的轉(zhuǎn)換和用一般類型的數(shù)據(jù)初始化對象都是一般構(gòu)造函數(shù)的功能。用對象調(diào)用成員函數(shù)不用構(gòu)造函數(shù),只要用“對象名成員函數(shù)名”即可。所以拷貝(復制)構(gòu)造函數(shù)的作用,只能是用對象來初始化對象。9下列說法中,正確的說法是參考答案為:BA全部的運算符都能被重載B運算

8、符被重載時,它們的優(yōu)先級與結(jié)合性不會轉(zhuǎn)變C當需要時,我們可以自定義一個運算符來進行重載D每個運算符都可以被重載成成員函數(shù)和友元函數(shù)解析當重載運算符時,不是全部的運算符都能被重載,有幾個運算符是不能被重載的,如三元運算符“?:”、*、:、#等;也不是每個運算符都可以被重載成成員函數(shù)和友元函數(shù),如運算符=、()、和都只能被重載成成員函數(shù);無論何時,都不能自定義運算符來進行重載,也即重載只能對已有運算符進行;但是運算符被重載時,它們的優(yōu)先級與結(jié)合性不會轉(zhuǎn)變。10下面對結(jié)構(gòu)或類中成員的訪問中,不正確的訪問是參考答案為:AA*pointer.salary; (其中pointer為指向類對象的指針)Bpo

9、inter->salary;Cx=worker.salary; (其中worker為具有類類型的對象)DLocation &rA=A1;int x=rAGetX(); (Location為已定義的類,A1為對象)解析因pointer為指向類對象的指針,所以“pointer->salary”是正確的訪問數(shù)據(jù)成員的形式;因worker為具有類類型的對象,所以“worker.salary”也是正確的訪問數(shù)據(jù)成員的形式;因Location為已定義的類,A1為對象,所以“Location &rA=A1;int x=rAGetX();”表示以對象A1初始化對象引用rA,然后由對

10、象引用rA調(diào)用成員函數(shù)GetX()給變量x賦值,這樣的訪問成員函數(shù)的形式也是正確的;“*pointer.salary;”中,由于運算符.的優(yōu)先級高于運算符*的優(yōu)先級,所以相當于“*(pointer.salary);”,那正確的形式應(yīng)當是“*(pointersalary);”。故“*pointer.salary”是不正確的訪問。11 C+ 對 C 語言作了很多改進,即從面對過程變成為面對對象的主要緣由是 ( )DA. 增加了一些新的運算符 B. 允許函數(shù)重載,并允許設(shè)置缺省參數(shù) C. 規(guī)定函數(shù)說明符必需用原型 D. 引進了類和對象的概念 12 下列符號不能組成標識符的是 (A ) A. 連接符

11、B. 下劃線 C. 大小寫字母 D. 數(shù)字字符 13 類型修飾符 unsigned 不能修飾 (D ) A. char B. int C. long int D. float 14在 int a=3,int *p=&a ;中, *p 的值是 ( D) A. 變量 a 的地址值 B. 無意義 C. 變量 p 的地址值 D.3 15下列關(guān)于指針的操作中,錯誤的是 (D ) A. 兩個同類型的指針可以進行比較運算 B. 可以用一個空指針賦給某個指針 C. 一個指針可以加上兩個整數(shù)之差 D. 兩個同類型的指針可以相加二,填空題不寫解答過程,將正確的答案寫在每小題的空格內(nèi)。錯填或不填均無分。1面

12、對對象程序設(shè)計中的多態(tài)性包括靜態(tài)多態(tài)性和動態(tài)多態(tài)性,前者由_機制支持,而后者則由_機制支持。答:函數(shù)重載、虛函數(shù)解析靜態(tài)多態(tài)性又稱編譯時多態(tài)性,調(diào)用何函數(shù)應(yīng)當在編譯之前就知道了,所以必需由函數(shù)重載機制來支持。動態(tài)多態(tài)性又稱運行時多態(tài)性,調(diào)用何函數(shù)只有在運行時才知道,所以由虛函數(shù)(與指針或引用)機制來支持。2由char const *str=”stucture”;所以定義的指針稱為_,關(guān)鍵字const 所修飾的是_。答:指向常量的指針、指針所指的字符串解析依據(jù)由*在修飾符“const”中位置的不同,它所修飾的對象也不同,“const ”表示所修飾的是指針所指的常量,該指針稱為指向常量的指針;“*

13、 const”表示所修飾的是指針本身,該指針稱為常指針;“* const *”則表示所修飾的是指針本身和指針所指常量,該指針稱為指向常量的常指針。3引入虛基類的目的是為了解決多重繼承中的_和_問題。答:二義性、多占用空間解析在允很多重繼承時可能消滅兩個問題,第一個是公有派生類中的成員通過不同基類調(diào)用它們上一級公共基類的同一成員,這就產(chǎn)生了調(diào)用的二義性;每一個基類都為它們的上一級公共基類存有備份,這就引起了公共基類的重復存儲,也就多占了存儲空間。引入虛基類的目的是為了解決多重繼承中的這兩個問題。4構(gòu)造函數(shù)與析構(gòu)函數(shù)所調(diào)用的虛函數(shù)是_的函數(shù),因此調(diào)用時實現(xiàn)的是_聯(lián)編。答:所在類、靜態(tài)解析在生成派生

14、類的對象時,先調(diào)用基類的構(gòu)造函數(shù)生成基類對象,再調(diào)用派生類的構(gòu)造函數(shù)來生成派生類對象。所以當在構(gòu)造函數(shù)中調(diào)用虛函數(shù)時,當調(diào)用基類的構(gòu)造函數(shù)時,此時派生類還未生成,所以它只能調(diào)用自己的虛函數(shù);調(diào)用派生類構(gòu)造函數(shù)時,它也只能調(diào)用自己的虛函數(shù),由于虛函數(shù)的調(diào)用是不能由派生類調(diào)用基類的。在析構(gòu)派生類對象是時,先調(diào)用派生類的析構(gòu)函數(shù)析構(gòu)掉派生類對象,再調(diào)用基類的析構(gòu)函數(shù)來析夠掉基類的對象。所以當在析夠構(gòu)函數(shù)中調(diào)用虛函數(shù)時,派生類的析構(gòu)函數(shù)調(diào)用的是它自己的虛函數(shù)(緣由同構(gòu)造函數(shù)),基類的析構(gòu)函數(shù)調(diào)用的也是它自己的虛函數(shù),由于此時派生類對象以已被析構(gòu)掉了。由上可見,當構(gòu)造函數(shù)與析夠函數(shù)調(diào)用虛函數(shù)時,它們調(diào)用

15、的都是自己類的函數(shù),因此調(diào)用時實現(xiàn)的是靜態(tài)聯(lián)編。7說明一個const成員函數(shù)(又稱常量成員函數(shù))的方法是,將const寫在_之間,而且它修飾的是_。答:函數(shù)頭與函數(shù)體、this指針解析為了說明一個常量成員函數(shù)的方法是,將const寫在函數(shù)頭的右圓括號)與函數(shù)體的左花括號之間,而且它修飾的是對象所屬的this指針。表示該函數(shù)不能修改它所在對象中的數(shù)據(jù)成員的值。20對某個運算符的重載,實際上是用關(guān)鍵字_與該運算符組成一個運算符函數(shù),而且該運算符函數(shù)的返回類型不能是_的。答:operater、void解析對某個運算符的重載,實際上是用關(guān)鍵字operater 與該運算符組成一個運算符函數(shù),而且該運算符

16、函數(shù)的返回類型不能是無類型的,即不能是void的。三改錯題1分析下列程序中的錯誤,并說明出錯緣由。# include class base const int n;public:base() cout<<”Initializing defaultn”; base(int m) cout<<”Initializingn”; n=m; base() cout<<”Destroyingn”; ;void main() base x(1);base y=x;答:(1) n=m; const數(shù)據(jù)成員不以該形式賦值(2)錯誤處base y=x;,以對象初始化對象解析(1

17、)作為const數(shù)據(jù)成員n不能用賦值表達式的形式為其賦初值,必需在定義構(gòu)造函數(shù)時在函數(shù)頭中以“base(int m):n(m)”形式來初始化。(2)base y=x; 語句中=不是賦值的意思,而是初始化的意思。即在定義類base的對象y時,以對象x給它初始化,相當于base y(x);。但是以對象初始化對象時,必需調(diào)用拷貝構(gòu)造函數(shù)才行。因程序中沒給出拷貝構(gòu)造函數(shù),也不能調(diào)用系統(tǒng)的缺省拷貝構(gòu)造函數(shù),因用戶給出了構(gòu)造函數(shù)后,再也不能調(diào)用系統(tǒng)供應(yīng)的任何缺省構(gòu)造函數(shù)。所以,base y=x;是錯誤的。2分析下列程序中的錯誤,并說明出錯緣由。#include class A int x;public:A

18、(int a) x=a; fun(); virtual void fun()=0;class B:public A public:B(int b) :A(b) void fun() ;void main() A aa(5);B bb(8); 答:1)A aa(5); 抽象類不能定義對象解析(1)在構(gòu)造函數(shù)“A(int a)”調(diào)用了純虛函數(shù)“fun()”,因構(gòu)造函數(shù)調(diào)用虛函數(shù)是靜態(tài)聯(lián)編,即調(diào)用的是它自己類的虛函數(shù)。在此調(diào)用的是純虛函數(shù),它只被說明,而未定義,所以不行能被執(zhí)行,因此出錯。(2)抽象類相當于是對類的引用性聲明,所以它只能定義該類的指針和引用,而不能定義它的對象。在此,A為抽象類,而“

19、A aa(5)”卻定義了A的對象,因此是錯誤的。3分析下列程序中的錯誤,并說明出錯緣由。#include class AA int aa;AA(int xx) aa=xx; public:int get() return aa; AA() cout<<”Destroying”<<AA<< endl; ;main() AA elem(5);cout<<elem.get()<<endl; 答:(1)AA(int xx) 的訪問屬性錯、應(yīng)具有公有屬性解析(1)構(gòu)造函數(shù)雖是由系統(tǒng)自動調(diào)用來生成對象的,但一般都是在類外調(diào)用,所以它的訪問屬性必需

20、是公有的。程序中構(gòu)造函數(shù)的訪問屬性是私有的(缺省值),運行中必定出錯。四.完成程序題(本大題共5小題,每小題4分,共20分)依據(jù)題目要求,完成程序填空。1認真閱讀下列求兩個點之間距離的程序,依據(jù)程序的輸出結(jié)果在劃線處填入正確語句。class point float x,y;public:point(float a,float b) x=a; y=b; float distance(point &p) float dx=_;float dy=_;return (float)sqrt(dx*dx+dy*dy);void main() point p1(2,3),p2(32,43);cout

21、<<p1._<<endl; 答: p.x-x p.y-ydistance(p2)解析由于求兩點之間距離的函數(shù)“distance”為成員函數(shù),所以由該函數(shù)的this指針所指對象可用作起點(參數(shù)之一),另一個用作終點的參數(shù),必需在函數(shù)的參數(shù)表中顯式地給出。dx 和dy分別計算兩個結(jié)點間x和y坐標間的距離,因此應(yīng)當為:dx=p.x x 和 dy =p.y y。對它們求平方相加后開方即可,得到兩點間的距離:(float)srrt(da*da+dy*dy)。在主程序中求p1和p2兩個結(jié)點之間的距離,由于由p1調(diào)用距離函數(shù),所以由p2作為它的參數(shù),即distance(p2)。2兩個

22、復數(shù)只有當它們的實部和虛部分別相等時,才被認為它們相等。在空格處填入合適的內(nèi)容,以完成下面的程序,使其重載運算符“=”,用以比較兩個復數(shù)的相等。請在主函數(shù)中輸出比較的結(jié)果。#include class complex double real,imag;public:complex(double r,double i) real=r; imag=i; bool operator=(complex &);int complex: operator=(complex &com) return(_) void main() complex c1(12.3,32.5),c2(21.7,1

23、8.6);if(_)return cout<<”truen”;elsereturn cout<<”falsen”; 答: (real=com.real)&&(imag=com.imag) c1=c2或c1.operator=(c2)解析若兩個復數(shù)的相等,則必有它們的實數(shù)部分和虛數(shù)部分都相等,所以運算符重載函數(shù)中返回“(real=com.real)&&(imag=com.imag)”,只有real=com.real與imag=com.imag都為真時,該函數(shù)的返回值才為真。在主程序中,為了比較兩個復數(shù)c1和c2,可以隱式地寫成“c1=c2”

24、,也可顯式寫成“c1.operator=(c2)”。3下列程序中聲明白兩個類AA和BB,其中函數(shù)“print”是類AA的成員函數(shù),但是類BB的友元函數(shù)。請在、和處各填入正確的內(nèi)容,使程序能正常運行。#include _;class AA int t;public:AA(int x) t=x; void print(BB &b);class BB int s;public:BB(int y) s=y; friend void _print(BB &);void _ cout<<”AA:”<<T<<”;BB:”<<W.S<<

25、;endl; void main() AA m(6);BB n(8);m.print(n); 答: class BB; AA: AA:print(BB &w)解析由于AA類的成員函數(shù)“print”是類BB的友元函數(shù),因此它必需有一個BB類的引用作為參數(shù),以便有引用BB類數(shù)據(jù)成員的接口。但此時BB類還未定義,為解決此沖突,在處先對BB類作引用性聲明“class BB;”,告知系統(tǒng)BB類在后面定義。由于函數(shù)“print”是類AA的成員函數(shù),在類外定義必需加上類名和作用域辨別符,即在處加上“AA:”。在BB類外定義“print”時,因是友元,所以沒有加上“BB:”的必要,但“AA:”還是必需

26、加的,所以在處填“AA:print(BB &w)”。五.程序分析題1請分析以下的程序,給出該程序的正確執(zhí)行結(jié)果。#include<iostream>using namespace std;機器運行結(jié)果7879與編譯器有關(guān)int add(int x,int y) return x+y; void main() int m=2,n=3;cout<<"1:"<<add(m+,m+n)<<endl; m=2,n=3;cout<<"2:"<<add(+m,m+n)<<end

27、l; m=2,n=3;cout<<"3:"<<add(m+n,m+)<<endl; m=2,n=3;cout<<"4:"<<add(m+n,+m)<<endl; 答:1:72:83:84:9解析在說明答案之前,要說明兩個問題:1)C+語言中,函數(shù)參數(shù)是壓在棧里的,因壓棧是從前往后進行的,所以出棧就是從后向前進行的,也即先取最終的參數(shù),然后再向前逐個取用;2)對于單加運算,m+是先執(zhí)行后加1,+m是加1后再執(zhí)行。由此,因m=2,n=3;,所以:1:(m+)+(m+n)=2+(2+3)=

28、7 (m+后執(zhí)行,且后加1,所以m=2始終未變)2:(+m)+(m+n)=3+(2+3)=8 (+m后執(zhí)行,但先加1,執(zhí)行+m時,m=3了)3:(m+n)+(m+)=(3+3)+2=8 (先執(zhí)行m+,后加1,執(zhí)行m+n時,m=3了)4:(m+n)+(+m)=(3+3)+3=9; (先執(zhí)行+m,且先加1,故一開頭就有m=3)3請分析下面的程序并給出該程序的執(zhí)行結(jié)果。#include class AA int a;public:AA() cout<<”Initualizing AA!n”; AA() cout<<”Destroying AA!n”;class BB int

29、b;AA p;public:BB() cout<<”Initualizing BB!n”; BB() cout<<”Destroying BB!n”;void main() BB X;cout<<”Ending main!n”;答:Initualizing AA!Initualizing BB!Ending main!Destroying BB!Destroying AA!解析雖然在主程序中只定義了一個類BB的對象,但在類BB中聲明白類AA的對象作為它的數(shù)據(jù)成員。當一個類中含有對象作為數(shù)據(jù)成員時,在生成對象時,先調(diào)用成員對象的構(gòu)造函數(shù),再調(diào)用類自己的構(gòu)造函數(shù)

30、,所以輸出了“Initualizing AA!”(成員對象構(gòu)造函數(shù)的輸出)和“Initualizing BB!”(類自己構(gòu)造函數(shù)的輸出)。對象生成后,執(zhí)行下一句輸出語句,則輸出“Ending main!”。此時程序結(jié)束,調(diào)用析構(gòu)函數(shù)來析構(gòu)掉對象,先調(diào)用類自身的析構(gòu)函數(shù),其輸出為“Destroying BB!”,再調(diào)用成員對象的析構(gòu)函數(shù),其輸出為“Destroying AA!”。4寫出下列程序的運行結(jié)果。#include class AA public:static int n;AA() n+; ;int AA:n=0;main() cout<<”AA:n=”<<AA:n

31、<<endl; AA d1;cout<<<d1.n<<endl; AA d2;cout<<<d2.n<<endl; AA d3,d4;cout<<<d1.n<<endl; cout<<<d2.n<<endl; 答:AA:n=0d1.n=1d2.n=2d1.n=4d2.n=4解析由于數(shù)據(jù)成員n的訪問屬性是公有的,所以在類外可訪問它;又它是靜態(tài)變量,所以具有全局性。在構(gòu)造函數(shù)中,執(zhí)行的是n+操作,即每次調(diào)用構(gòu)造函數(shù)n就加1。當程序開頭時,因未定義對象,所以n的值為初始

32、化時的值,則輸出為“AA:n=0”。當定義了對象d1后,由于調(diào)用了構(gòu)造函數(shù),則該對象中n=1,故輸出“d1.n=1”。同理,對象d2輸出“d2.n=2”。由于接下來生成了兩個對象d3和d4,調(diào)用兩次構(gòu)造函數(shù),n兩次加1,此時n=4,所以下面兩條語句的輸出為“d1.n=4”和“d2.n=4”。5寫出下列程序的輸出結(jié)果。#include class AA public:AA cout<<”Constructor of AA n”; fun(); virtual void fun() cout<<”AA:fun() calledn”; ;class BB:public AA

33、public:BB() cout<<”Constructor of BBn”; fun(); void fun() cout<<”BB:fun() calledn”; ;void main() BB d; 答:Constructor of AAAA:fun() called. Constructor of BB.BB:fun() called.解析雖然函數(shù)fun()說明為虛函數(shù),但當在構(gòu)造函數(shù)中被調(diào)用時,呈現(xiàn)的是靜態(tài)聯(lián)編,即基類和派生類都調(diào)用各自的函數(shù)fun()。所以,當生成對象d時,先調(diào)用基類的構(gòu)造函數(shù),在構(gòu)造函數(shù)中又調(diào)用自己的函數(shù)“fun()”,所以輸出為“Cons

34、tructor of AA”和“AA:fun() called.”。同理調(diào)用派生類的構(gòu)造函數(shù)時,生成的輸出為“Constructor of BB.”和“BB:fun() called.”。6請給出下面的程序的輸出結(jié)果。#include template class Tvoid sort(T* a,int n) T num;for(int i=0;i<n-1;i+) for(int j=i;j<n-1;j+) if(aj>aj+1) num=aj; aj=aj+1; aj+1=num; for(i=0;i<n;i+) cout<<ai<<endl;

35、 void main() int iver5= 12,45,9,23,37 ;double dver5= 22.3,56.7,43.5,13.8,8.6 ;sort(iver,5);sort(dver,.5);答:9 12 23 37 458.6 13.8 22.3 43.5 56.7解析這是使用模板的例子。函數(shù)sort是一個遞增的排序函數(shù),T是個模板。當數(shù)組是整型數(shù)據(jù)類型時,它為整型數(shù)組排序;當數(shù)組為雙精度數(shù)據(jù)類型時,它為雙精度數(shù)組排序。所以輸出如上結(jié)果。7分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> void main()int a; int &b=

36、a; / 變量引用 b=10; cout<<"a="<<a<<endl; 解: 本題說明變量引用的方法。b是a的引用,它們安排相同的空間,b的值即為a的值。所以輸出為 a=10。8分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample int x; public: Sample(); Sample(int a)x=a;Sample(Sample &a)x=a.x+1; void disp()cout<<"x="<<x<<endl

37、; ; void main() Sample s1(2),s2(s1); s2.disp(); 解: 本題說明類拷貝構(gòu)造函數(shù)的使用方法。Sample類的Sample(Sample &a)構(gòu)造函數(shù)是一個拷貝構(gòu)造函數(shù),將a對象的x值賦給當前對象的x后加1。 所以輸出為:x=3。9 分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample public: int x; int y; void disp() cout<<"x="<<x<<",y="<<y<

38、<endl; ; void main() int Sample:*pc; Sample s,*p=&s; pc=&Sample:x; p->*pc=10; pc=&Sample:y; p->*pc=20; p->disp(); 解: 本題說明白類數(shù)據(jù)成員指針的使用方法。這里通過指向?qū)ο蟮闹羔榿斫o類數(shù)據(jù)成員賦值,其原理與上題相像。輸出為: x=10,y=20 10分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample int x; int y; public: Sample(int a,int b)

39、x=a;y=b; int getx()return x; int gety()return y; ; void main() int (Sample:*fp)(); fp=&Sample:getx; Sample s(2,7); int v=(s.*fp)(); fp=&Sample:gety; int t=(s.*fp)(); cout<<"v="<<v<<",t="<<t<<endl; 解: 本題說明白類成員函數(shù)指針的使用方法。在main()中定義的fp是一個指向Sample

40、類成員函數(shù)的指針。執(zhí)行fp=Sample:getx后。fp指向成員函數(shù)getx(),int v=(s.*fp)()語句等價于int v.getx(),v=x=2;執(zhí)行fp=Sample:gety之后,fp指向成員函數(shù)gety(),int t=(s.*fp)()語句等價于int t=s.gety(),t=x=7。所以輸出為:v=2,t=7 11分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample int x; int y; public: Sample(int a,int b) x=a;y=b; int getx()return x; int g

41、ety()return y; ; void main() int (Sample:*fp)(); fp=&Sample:getx; Sample s(2,7),*p=&s; int v=(p->*fp)(); fp=&Sample:gety; int t=(p->*fp)(); cout<<"v="<<v<<",t="<<t<<endl; 解: 本題說明白類成員函數(shù)指針的使用方法。這里通過指向?qū)ο蟮闹羔榿碚{(diào)用指向類成員函數(shù)的指針,其原理與上題相像。輸出仍為:

42、v=2,t=7 12分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class base public: base()cout<<"constructing base class"<<endl; base()cout<<"destructing base class"<<endl; ; class subs:public base public: subs()cout<<"constructing sub class"<<endl;

43、subs()cout<<"destructing sub class"<<endl; ; void main() subs s; 解: 本題說明單繼承狀況下構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用挨次。這里base為基類,subs為派生類。所以輸出為: constructing base class constructing sub class destructing sub class destrcuting base class 留意:在單繼承狀況下,首先調(diào)用基類的構(gòu)造函數(shù) ,隨后調(diào)用派生類的構(gòu)造函數(shù),析構(gòu)函數(shù)的調(diào)用挨次則正好相反。 13 分析以下程序的執(zhí)行結(jié)果

44、: #include<iostream.h>class base int n; public: base(int a) cout<<"constructing base class"<<endl; n=a; cout<<"n="<<n<<endl; base()cout<<"destructing base class"<<endl; ; class subs:public base base bobj; int m; public: su

45、bs(int a,int b,int c):base(a),bobj(c) cout<<"constructing sub cass"<<endl; m=b; cout<<"m="<<m<<endl; subs()cout<<"destructing sub class"<<endl; ; void main() subs s(1,2,3); 解: 本題說明 派生類中含有對象成員狀況下構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用挨次。這里base為基類,subs為派生類,

46、subs類的構(gòu)造函數(shù)中含有對象成員。 所以輸出為: constrcuting base class n=1 constructing base class n=3 constructing sub class m=2destructing sub class destructing base class destructing base class 留意:當派生類中含有對象成員時,構(gòu)造函數(shù)的調(diào)用挨次如下: 基類的構(gòu)造函數(shù) 2)對象成員的構(gòu)造函數(shù) 3)派生類的構(gòu)造函數(shù) 析構(gòu)函數(shù)的調(diào)用挨次與之相反 14分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class A p

47、ublic: int n; ; class B:public A; class C:public A; class D:public B,public C int getn()return B:n; ; void main() D d; d.B:n=10; d.C:n=20; cout<<d.B:n<<","<<d.C:n<<endl; 解: D類是從類和類派生的而類和類又都是從類派生的,但各有自己的副本。所以對于對象d,d.B:n與d.C:n是兩個不同的數(shù)據(jù)成員它們互無聯(lián)系。 所以輸出為: 10,20 15分析以下程序的執(zhí)行

48、結(jié)果 #include<iostream.h> class A public: int n; ; class B:virtual public A; class C:virtual public A; class D:public B,public C int getn()return B:n; ; void main() D d; d.B:n=10; d.C:n=20; cout<<d.B:n<<","<<d.C:n<<endl; 解: D類是從類和類派生的而類和類又都是從類派生,但這是虛繼承關(guān)系即是虛基類因此和

49、共用一個的副本所以對于對象d,d.B:n與d.C:n是一個成員。 所以輸出為: 20,20 16分析以下程序執(zhí)行結(jié)果 #include<iostream.h> int add(int x,int y) return x+y; double add(double x,double y) return x+y; void main() int a=4,b=6; double c=2.6,d=7.4; cout<<add(a,b)<<","<<add(c,d)<<endl; 解: 本題說明函數(shù)重載的使用方法, 這里有兩個

50、add()函數(shù),一個add()函數(shù)的參數(shù)與返回值為int型,另一個的參數(shù)與返回值為double型,它們是依據(jù)參數(shù)類型自動區(qū)分的。 所以輸出為: 10,10 17分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample int i; double d; public: void setdata(int n)i=n; void setdata(double x)d=x; void disp() cout<<"i="<<i<<",d="<<d<<endl;

51、 ; void main() Sample s; s.setdata(10); s.setdata(15.6); s.disp(); 解: 本題說明重載成員函數(shù)的使用方法。setdata()成員函數(shù)有兩個,依據(jù)其參數(shù)類型加以區(qū)分。 所以輸出為:i=10, d=15.6 22分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> class Sample int n; public: Sample() Sample(int i)n=i; Sample &operator =(Sample); void disp()cout<<"n="

52、<<n<<endl; ; Sample &Sample:operator=(Sample s) Sample:n=s.n; return *this; void main() Sample s1(10),s2; s2=s1; s2.disp(); 解: 本題說明重載運算符(=)的使用方法。operator=成員函數(shù)實現(xiàn)兩個對象的賦值。 所以輸出為: n=10 六程序設(shè)計題1設(shè)計一個三角形類Triangle,包含三角形三條邊長的私有數(shù)據(jù)成員,另有一個重載運算符“+”,以實現(xiàn)求兩個三角形對象的面積之和。 解:在Triangle類中設(shè)計一個友元函數(shù)operator+(

53、Triangle t1,Triangle t2),它重載運算符"+",返回t1和t2兩個三角形的面積之和。 本題程序如下: #include<iostream.h> #include<math.h> class Triangle int x,y,z; double area; public: Triangle(int i,int j,int k) double s; x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() cout<<"

54、Area="<<area<<endl; friend double operator+(Triangle t1,Triangle t2) return t1.area+t2.area; ; void main() Triangle t1(3,4,5),t2(4,5,6); double s; cout<<"t1:" t1.disparea(); cout<<"t2:" t2.disparea(); s=t1+t2; cout<<"總面積="<<s<<endl; 本程序執(zhí)行結(jié)果如下: t1:Area=6 t2:Area=9.92157 總面積=15.9216 2重載運算符“+”友元函數(shù)只能返回兩個三角形的面積之和,不能計算三個三角形的面積之和,改進一下,使之能計算任意多個三角形的面積之和。 解: 重載運算符為什么不能計算3個三角形的面積之和呢?對于式子:s=t1+t2+t3,先計算t1+t2,返回一個double數(shù)然后再進行該double數(shù)+t3的計算,明顯沒有這樣的重載運算符“+”友元函數(shù),只需要添加這樣重

溫馨提示

  • 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

提交評論