版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1 面向?qū)ο蟪绦蛟O(shè)計(jì)中的數(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)過加密處理都不是面向?qū)ο蟪绦蛟O(shè)計(jì)的特征;對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)上也不可能建有防火墻,所以它們都不是面向?qū)ο蟪绦蛟O(shè)計(jì)中所指的數(shù)據(jù)隱藏。面向?qū)ο蟪绦蛟O(shè)計(jì)系統(tǒng)中的封裝單位是對象,對象之間只能通過接口進(jìn)行信息交流,外部不能對對象中的數(shù)據(jù)隨意地進(jìn)行訪問,這就造成了對象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的不可訪問性,也使得數(shù)據(jù)被隱藏在對象中。這就是面向?qū)ο蟪绦蛟O(shè)計(jì)中的數(shù)據(jù)隱藏所指。2 下列各項(xiàng)中符合函數(shù)重載必須滿足的條件的是參考答案為:DA
2、 必須有不同的參數(shù)個數(shù)B對應(yīng)的參數(shù)類型必須不相同C. A和B必須同時滿足DA和B只要滿足一個即可解析我們知道,在同一個作用域中,要實(shí)現(xiàn)函數(shù)重載必須滿足的條件的是: 有不同的參數(shù)個數(shù);或者 對應(yīng)的參數(shù)有不相同的數(shù)據(jù)類型,即和中只要有一個滿足就可以了。當(dāng)然兩者都滿足更好,但這不是必須的。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ù)。從所給出的四個選項(xiàng)來看,只有“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)造函數(shù)、“
4、CSample()”是該類的析構(gòu)函數(shù),這三個語句都是正確的。錯誤的語句是“int a=23”,因?yàn)樗`反了在類的聲明(不管是引用性聲明,還是定義性聲明)中都不能以賦值表達(dá)式的形式給它的數(shù)據(jù)成員進(jìn)行初始化。5已知類A中的一個成員函數(shù)的說明如下:void Set(A &a);則該函數(shù)的參數(shù)“A &a”的含義是參考答案為:CA指向A的指針為aB將變量a的地址賦給類AC類A對象引用a用作函數(shù)的形參D變量A與a按位與后作函數(shù)參數(shù)解析因?yàn)锳是一個類,所以“A &a”表示a是類A的對象,但因?yàn)閷ο骯的前綴了符號“&”,則“&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; 則其中()是非法的表達(dá)式。參考答案為:DAvoid get();Bint k;Cvoid make();Dk=i*j;解析對于給定的四項(xiàng)中,前三項(xiàng)都是正確的,只有第四項(xiàng)是錯誤的。因?yàn)?,類B是類A的私有派生類(缺省訪問類型),所以A中的公類型的數(shù)據(jù)成員在類B中成為了私有數(shù)據(jù)成員,但函數(shù)“void B:make()
6、”既然是類B的成員函數(shù),則既可訪問類A中的公有數(shù)據(jù)成員,也能訪問類B中的私有數(shù)據(jù)成員,則表達(dá)式“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 *pb;解析
7、在類A中,函數(shù)“virtual void fun()=0”為純虛函數(shù),因此,類A為抽象類。作為抽象類,它是不能被用來定義具體對象的,而語句“A a(5);”恰恰是定義抽象類的對象的,所以它是錯誤的8拷貝(復(fù)制)構(gòu)造函數(shù)的作用是參考答案為:CA進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換B用對象調(diào)用成員函數(shù)C用對象初始化對象D用一般類型的數(shù)據(jù)初始化對象解析進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換和用一般類型的數(shù)據(jù)初始化對象都是一般構(gòu)造函數(shù)的功能。用對象調(diào)用成員函數(shù)不用構(gòu)造函數(shù),只要用“對象名成員函數(shù)名”即可。所以拷貝(復(fù)制)構(gòu)造函數(shù)的作用,只能是用對象來初始化對象。9下列說法中,正確的說法是參考答案為:BA所有的運(yùn)算符都能被重載B運(yùn)算符被重載
8、時,它們的優(yōu)先級與結(jié)合性不會改變C當(dāng)需要時,我們可以自定義一個運(yùn)算符來進(jìn)行重載D每個運(yùn)算符都可以被重載成成員函數(shù)和友元函數(shù)解析當(dāng)重載運(yùn)算符時,不是所有的運(yùn)算符都能被重載,有幾個運(yùn)算符是不能被重載的,如三元運(yùn)算符“?:”、*、:、#等;也不是每個運(yùn)算符都可以被重載成成員函數(shù)和友元函數(shù),如運(yùn)算符=、()、和都只能被重載成成員函數(shù);無論何時,都不能自定義運(yùn)算符來進(jìn)行重載,也即重載只能對已有運(yùn)算符進(jìn)行;但是運(yùn)算符被重載時,它們的優(yōu)先級與結(jié)合性不會改變。10下面對結(jié)構(gòu)或類中成員的訪問中,不正確的訪問是參考答案為:AA*pointer.salary; (其中pointer為指向類對象的指針)Bpointe
9、r->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,然后由對象引用r
10、A調(diào)用成員函數(shù)GetX()給變量x賦值,這樣的訪問成員函數(shù)的形式也是正確的;“*pointer.salary;”中,因?yàn)檫\(yùn)算符.的優(yōu)先級高于運(yùn)算符*的優(yōu)先級,所以相當(dāng)于“*(pointer.salary);”,那正確的形式應(yīng)該是“*(pointersalary);”。故“*pointer.salary”是不正確的訪問。11 C+ 對 C 語言作了很多改進(jìn),即從面向過程變成為面向?qū)ο蟮闹饕蚴?( )DA. 增加了一些新的運(yùn)算符 B. 允許函數(shù)重載,并允許設(shè)置缺省參數(shù) C. 規(guī)定函數(shù)說明符必須用原型 D. 引進(jìn)了類和對象的概念 12 下列符號不能組成標(biāo)識符的是 (A ) A. 連接符 B. 下
11、劃線 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. 兩個同類型的指針可以進(jìn)行比較運(yùn)算 B. 可以用一個空指針賦給某個指針 C. 一個指針可以加上兩個整數(shù)之差 D. 兩個同類型的指針可以相加二,填空題不寫解答過程,將正確的答案寫在每小題的空格內(nèi)。錯填或不填均無分。1面向?qū)ο蟪?/p>
12、序設(shè)計(jì)中的多態(tài)性包括靜態(tài)多態(tài)性和動態(tài)多態(tài)性,前者由_機(jī)制支持,而后者則由_機(jī)制支持。答:函數(shù)重載、虛函數(shù)解析靜態(tài)多態(tài)性又稱編譯時多態(tài)性,調(diào)用何函數(shù)應(yīng)該在編譯之前就知道了,所以必須由函數(shù)重載機(jī)制來支持。動態(tài)多態(tài)性又稱運(yùn)行時多態(tài)性,調(diào)用何函數(shù)只有在運(yùn)行時才知道,所以由虛函數(shù)(與指針或引用)機(jī)制來支持。2由char const *str=”stucture”;所以定義的指針稱為_,關(guān)鍵字const 所修飾的是_。答:指向常量的指針、指針?biāo)傅淖址馕龈鶕?jù)由*在修飾符“const”中位置的不同,它所修飾的對象也不同,“const ”表示所修飾的是指針?biāo)傅某A浚撝羔樂Q為指向常量的指針;“* con
13、st”表示所修飾的是指針本身,該指針稱為常指針;“* const *”則表示所修飾的是指針本身和指針?biāo)赋A浚撝羔樂Q為指向常量的常指針。3引入虛基類的目的是為了解決多重繼承中的_和_問題。答:二義性、多占用空間解析在允許多重繼承時可能出現(xiàn)兩個問題,第一個是公有派生類中的成員通過不同基類調(diào)用它們上一級公共基類的同一成員,這就產(chǎn)生了調(diào)用的二義性;每一個基類都為它們的上一級公共基類存有備份,這就引起了公共基類的重復(fù)存儲,也就多占了存儲空間。引入虛基類的目的是為了解決多重繼承中的這兩個問題。4構(gòu)造函數(shù)與析構(gòu)函數(shù)所調(diào)用的虛函數(shù)是_的函數(shù),因此調(diào)用時實(shí)現(xiàn)的是_聯(lián)編。答:所在類、靜態(tài)解析在生成派生類的對象
14、時,先調(diào)用基類的構(gòu)造函數(shù)生成基類對象,再調(diào)用派生類的構(gòu)造函數(shù)來生成派生類對象。所以當(dāng)在構(gòu)造函數(shù)中調(diào)用虛函數(shù)時,當(dāng)調(diào)用基類的構(gòu)造函數(shù)時,此時派生類還未生成,所以它只能調(diào)用自己的虛函數(shù);調(diào)用派生類構(gòu)造函數(shù)時,它也只能調(diào)用自己的虛函數(shù),因?yàn)樘摵瘮?shù)的調(diào)用是不能由派生類調(diào)用基類的。在析構(gòu)派生類對象是時,先調(diào)用派生類的析構(gòu)函數(shù)析構(gòu)掉派生類對象,再調(diào)用基類的析構(gòu)函數(shù)來析夠掉基類的對象。所以當(dāng)在析夠構(gòu)函數(shù)中調(diào)用虛函數(shù)時,派生類的析構(gòu)函數(shù)調(diào)用的是它自己的虛函數(shù)(原因同構(gòu)造函數(shù)),基類的析構(gòu)函數(shù)調(diào)用的也是它自己的虛函數(shù),因?yàn)榇藭r派生類對象以已被析構(gòu)掉了。由上可見,當(dāng)構(gòu)造函數(shù)與析夠函數(shù)調(diào)用虛函數(shù)時,它們調(diào)用的都是自
15、己類的函數(shù),因此調(diào)用時實(shí)現(xiàn)的是靜態(tài)聯(lián)編。7說明一個const成員函數(shù)(又稱常量成員函數(shù))的方法是,將const寫在_之間,而且它修飾的是_。答:函數(shù)頭與函數(shù)體、this指針解析為了說明一個常量成員函數(shù)的方法是,將const寫在函數(shù)頭的右圓括號)與函數(shù)體的左花括號之間,而且它修飾的是對象所屬的this指針。表示該函數(shù)不能修改它所在對象中的數(shù)據(jù)成員的值。20對某個運(yùn)算符的重載,實(shí)際上是用關(guān)鍵字_與該運(yùn)算符組成一個運(yùn)算符函數(shù),而且該運(yùn)算符函數(shù)的返回類型不能是_的。答:operater、void解析對某個運(yùn)算符的重載,實(shí)際上是用關(guān)鍵字operater 與該運(yùn)算符組成一個運(yùn)算符函數(shù),而且該運(yùn)算符函數(shù)的返
16、回類型不能是無類型的,即不能是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)作為c
17、onst數(shù)據(jù)成員n不能用賦值表達(dá)式的形式為其賦初值,必須在定義構(gòu)造函數(shù)時在函數(shù)頭中以“base(int m):n(m)”形式來初始化。(2)base y=x; 語句中=不是賦值的意思,而是初始化的意思。即在定義類base的對象y時,以對象x給它初始化,相當(dāng)于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)提供的任何缺省構(gòu)造函數(shù)。所以,base y=x;是錯誤的。2分析下列程序中的錯誤,并說明出錯原因。#include class A int x;public:A(int
18、 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)抽象類相當(dāng)于是對類的引用性聲明,所以它只能定義該類的指針和引用,而不能定義它的對象。在此,A為抽象類,而“A aa
19、(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ù)的訪問屬性是私有的(缺省值),運(yùn)行中必定出錯。四.完成程序題(本大題共5小題,每小題4分,共20分)根據(jù)題目要求,完成程序填空。1仔細(xì)閱讀下列求兩個點(diǎn)之間距離的程序,根據(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)解析由于求兩點(diǎn)之間距離的函數(shù)“distance”為成員函數(shù),所以由該函數(shù)的this指針?biāo)笇ο罂捎米髌瘘c(diǎn)(參數(shù)之一),另一個用作終點(diǎn)的參數(shù),必須在函數(shù)的參數(shù)表中顯式地給出。dx 和dy分別計(jì)算兩個結(jié)點(diǎn)間x和y坐標(biāo)間的距離,因此應(yīng)該為:dx=p.x x 和 dy =p.y y。對它們求平方相加后開方即可,得到兩點(diǎn)間的距離:(float)srrt(da*da+dy*dy)。在主程序中求p1和p2兩個結(jié)點(diǎn)之間的距離,由于由p1調(diào)用距離函數(shù),所以由p2作為它的參數(shù),即distance(p2)。2兩個復(fù)數(shù)只有
22、當(dāng)它們的實(shí)部和虛部分別相等時,才被認(rèn)為它們相等。在空格處填入合適的內(nèi)容,以完成下面的程序,使其重載運(yùn)算符“=”,用以比較兩個復(fù)數(shù)的相等。請?jiān)谥骱瘮?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,18.6)
23、;if(_)return cout<<”truen”;elsereturn cout<<”falsen”; 答: (real=com.real)&&(imag=com.imag) c1=c2或c1.operator=(c2)解析若兩個復(fù)數(shù)的相等,則必有它們的實(shí)數(shù)部分和虛數(shù)部分都相等,所以運(yùn)算符重載函數(shù)中返回“(real=com.real)&&(imag=com.imag)”,只有real=com.real與imag=com.imag都為真時,該函數(shù)的返回值才為真。在主程序中,為了比較兩個復(fù)數(shù)c1和c2,可以隱式地寫成“c1=c2”,也可顯
24、式寫成“c1.operator=(c2)”。3下列程序中聲明了兩個類AA和BB,其中函數(shù)“print”是類AA的成員函數(shù),但是類BB的友元函數(shù)。請?jiān)?、和處各填入正確的內(nèi)容,使程序能正常運(yùn)行。#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<<end
25、l; 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類在后面定義。因?yàn)楹瘮?shù)“print”是類AA的成員函數(shù),在類外定義必須加上類名和作用域分辨符,即在處加上“AA:”。在BB類外定義“print”時,因是友元,所以沒有加上“BB:”的必要,但“AA:”還是必須加的,所
26、以在處填“AA:print(BB &w)”。五.程序分析題1請分析以下的程序,給出該程序的正確執(zhí)行結(jié)果。#include<iostream>using namespace std;機(jī)器運(yùn)行結(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)<<endl; m
27、=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ù)是壓在棧里的,因壓棧是從前往后進(jìn)行的,所以出棧就是從后向前進(jìn)行的,也即先取最后的參數(shù),然后再向前逐個取用;2)對于單加運(yùn)算,m+是先執(zhí)行后加1,+m是加1后再執(zhí)行。由此,因m=2,n=3;,所以:1:(m+)+(m+n)=2+(2+3)=7 (m
28、+后執(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 b;AA
29、 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ù)成員。當(dāng)一個類中含有對象作為數(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寫出下列程序的運(yùn)行結(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。當(dāng)程序開始時,因未定義對象,所以n的值為初始化時的值
32、,則輸出為“AA:n=0”。當(dāng)定義了對象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 publ
33、ic: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ù),但當(dāng)在構(gòu)造函數(shù)中被調(diào)用時,呈現(xiàn)的是靜態(tài)聯(lián)編,即基類和派生類都調(diào)用各自的函數(shù)fun()。所以,當(dāng)生成對象d時,先調(diào)用基類的構(gòu)造函數(shù),在構(gòu)造函數(shù)中又調(diào)用自己的函數(shù)“fun()”,所以輸出為“Construc
34、tor 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; voi
35、d 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是個模板。當(dāng)數(shù)組是整型數(shù)據(jù)類型時,它為整型數(shù)組排序;當(dāng)數(shù)組為雙精度數(shù)據(jù)類型時,它為雙精度數(shù)組排序。所以輸出如上結(jié)果。7分析以下程序的執(zhí)行結(jié)果 #include<iostream.h> void main()int a; int &b=a; /
36、 變量引用 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值賦給當(dāng)前對象的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) x=a;
39、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 gety(
41、)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ù)的指針,其原理與上題相似。輸出仍為: v=2,
42、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; subs
43、()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é)果: #i
44、nclude<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: subs(i
45、nt 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為派生類,subs
46、類的構(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 注意:當(dāng)派生類中含有對象成員時,構(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 publi
47、c: 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í)行結(jié)果 #
48、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ù)重載的使用方法, 這里有兩個add(
50、)函數(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; ; v
51、oid 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(); 解: 本題說明重載運(yùn)算符(=)的使用方法。operator=成員函數(shù)實(shí)現(xiàn)兩個對象的賦值。 所以輸出為: n=10 六程序設(shè)計(jì)題1設(shè)計(jì)一個三角形類Triangle,包含三角形三條邊長的私有數(shù)據(jù)成員,另有一個重載運(yùn)算符“+”,以實(shí)現(xiàn)求兩個三角形對象的面積之和。 解:在Triangle類中設(shè)計(jì)一個友元函數(shù)operator+(Tria
53、ngle t1,Triangle t2),它重載運(yùn)算符"+",返回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<<"Area
54、="<<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重載運(yùn)算符“+”友元函數(shù)只能返回兩個三角形的面積之和,不能計(jì)算三個三角形的面積之和,改進(jìn)一下,使之能計(jì)算任意多個三角形的面積之和。 解: 重載運(yùn)算符為什么不能計(jì)算3個三角形的面積之和呢?對于式子:s=t1+t2+t3,先計(jì)算t1+t2,返回一個double數(shù)然后再進(jìn)行該double數(shù)+t3的計(jì)算,顯然沒有這樣的重載運(yùn)算符“+”友元函數(shù),只需要添加這樣重載運(yùn)算符
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保公益活動策劃執(zhí)行合同
- 2024年物流人才培養(yǎng)與交流合同
- 系統(tǒng)開發(fā)課程設(shè)計(jì)日志
- 托班喂飯課程設(shè)計(jì)
- 蘇教版小學(xué)數(shù)學(xué)課程設(shè)計(jì)
- 藝術(shù)治療繪畫課程設(shè)計(jì)
- 廣東電網(wǎng)公司110kV車載移動式變電站技術(shù)規(guī)范書
- 洗滌廢水處理課程設(shè)計(jì)
- 編輯文章課程設(shè)計(jì)意圖
- 網(wǎng)頁設(shè)計(jì)課程設(shè)計(jì)總結(jié)
- 2024中國近海生態(tài)分區(qū)
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期1月期末考試化學(xué)試題(解析版)
- 企業(yè)節(jié)能獎懲管理制度(3篇)
- 統(tǒng)編版2024-2025學(xué)年三年級上冊語文期末情景試卷 (無答案)
- 2024年時事政治試題【有答案】
- 造價咨詢部組織架構(gòu)及基本工作流程
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識
- MT 285-1992縫管錨桿
- GB 18613-2020 電動機(jī)能效限定值及能效等級
- 水稻幼穗分化八個時期的劃分表
- 卡特彼勒生產(chǎn)體系手冊(PDF62頁)
評論
0/150
提交評論