浙江理工大学-2018-2019学年面向对象程序设计A-期末复习资料
?
- 選擇題
1.下面對(duì)于類的描述,是正確的是(???? )
A.類是抽象數(shù)據(jù)類型的實(shí)現(xiàn)
B.類是具有共同行為和屬性的若干對(duì)象的統(tǒng)一描述體
C.所有的類都能創(chuàng)建對(duì)象
D.類就是C語言中的結(jié)構(gòu)類型
解析:
A:P87
B:P87 類是具有共同行為和屬性的若干對(duì)象的統(tǒng)一描述體
C:P202 抽象類不能創(chuàng)建對(duì)象
D:P85 P89 類不等于C語言中的結(jié)構(gòu)類型
正確答案:B
?
2.下列關(guān)于C++函數(shù)的說明中,正確的是 (???? )
A.內(nèi)聯(lián)函數(shù)就是定義在另一個(gè)函數(shù)體內(nèi)部的函數(shù)
B.函數(shù)體的最后一條語句必須是return語句
C.標(biāo)準(zhǔn)C++要求在調(diào)用一個(gè)函數(shù)之前,必須先聲明其原型
D.編譯器會(huì)根據(jù)函數(shù)的返回值類型和參數(shù)表來區(qū)分函數(shù)的不同重載形式
解析:
A:P62 內(nèi)聯(lián)函數(shù)是對(duì)編譯器的一種建議,對(duì)被調(diào)用的簡(jiǎn)單函數(shù)進(jìn)行替換
B:P55 函數(shù)體的最后一條語句可以是任意的語句
C:P49 標(biāo)準(zhǔn)C++要求在調(diào)用一個(gè)函數(shù)之前,必須先聲明其原型
D:P57 編譯器會(huì)根據(jù)函數(shù)的參數(shù)表來區(qū)分函數(shù)的不同重載形式
正確答案:C
?
3.下列不是描述類的成員函數(shù)的是(???? )
A.構(gòu)造函數(shù)?????????????? ?B.析構(gòu)函數(shù)
C.友元函數(shù)??????????????? D.拷貝構(gòu)造函數(shù)
解析:P132 友元函數(shù)并非類的成員函數(shù)
正確答案:C
?
4.構(gòu)造函數(shù)不具備的特征的是(???? )
A.構(gòu)造函數(shù)的函數(shù)名與類名相同???????????? B.構(gòu)造函數(shù)可以重載
C.構(gòu)造函數(shù)可以設(shè)置默認(rèn)參數(shù)??????????????? D.構(gòu)造函數(shù)必須指定類型說明
解析:P96 構(gòu)造函數(shù)不需要指定類型聲明
正確答案:D
?
5.下面有關(guān)重載函數(shù)的說法中正確的是(???? )
A.重載函數(shù)必須具有不同的返回值類型
B.重載函數(shù)形參個(gè)數(shù)必須不同
C.重載函數(shù)必須有不同的形參列表
D.重載函數(shù)名可以不同
解析:
A:重載函數(shù)可以具有不同的返回值類型
B:重載函數(shù)形參個(gè)數(shù)可以相同,但是形參相同時(shí),形參數(shù)據(jù)類型不能完全相同
C:P57 載函數(shù)必須有不同的形參列表
D:重載函數(shù)名必須相同
正確答案:C
?
6.下面關(guān)于C++中類的繼承與派生的說法錯(cuò)誤的是(???? )
A.基類的protected成員在公有派生類的成員函數(shù)中可以直接使用
B.基類的protected成員在私有派生類的成員函數(shù)中可以直接使用
C.有派生時(shí),基類的所有成員訪問權(quán)限在派生類中保持不變
D.繼承可以分為單一繼承與多重繼承
解析:
A:P144 基類的protected成員在公有派生類的成員函數(shù)中是protected的,所以可以直接使用
B:P144 基類的protected成員在公有派生類的成員函數(shù)中是private的,所以可以直接使用
C:P147 基類的所有成員訪問權(quán)限在派生類中根據(jù)派生類型的不同,派生類的成員訪問權(quán)限會(huì)發(fā)生改變
D:P142 繼承可以分為單一繼承與多重繼承
正確答案:C
?
7.下面關(guān)于運(yùn)算符重載的描述錯(cuò)誤的是()
A.運(yùn)算符重載不能改變操作數(shù)的個(gè)數(shù)、運(yùn)算符的優(yōu)先級(jí)、運(yùn)算符的結(jié)合性和運(yùn)算符的語法結(jié)構(gòu)
B.不是所有的運(yùn)算符都可以進(jìn)行重載
C.運(yùn)算符函數(shù)的調(diào)用必須使用關(guān)鍵字operator
D.在C++語言中不可通過運(yùn)算符重載創(chuàng)造出新的運(yùn)算符
解析:P223 運(yùn)算符函數(shù)的調(diào)用不必須使用關(guān)鍵字operator,可以隱式調(diào)用
正確答案:C
?
8.關(guān)于虛函數(shù)的描述中,( )是正確的。
A.虛函數(shù)是一個(gè)static類型的成員函數(shù)
B.虛函數(shù)是一個(gè)非成員函數(shù)
C..基類中說明了虛函數(shù)后,派生類中將其對(duì)應(yīng)的函數(shù)可不必說明為虛函數(shù)
D.派生類的虛函數(shù)與基類的虛函數(shù)具有不同的參數(shù)個(gè)數(shù)和類型
解析:
A:虛函數(shù)不是一個(gè)static類型的成員函數(shù)
B:虛函數(shù)是一個(gè)成員函數(shù)
C:P197 基類中說明了虛函數(shù)后,派生類中將其對(duì)應(yīng)的函數(shù)可不必說明為虛函數(shù)
D:P197 派生類的虛函數(shù)與基類的虛函數(shù)具有相同的參數(shù)個(gè)數(shù)和類型
正確答案:C
?
9.假定AB為一個(gè)類,則執(zhí)行AB x;語句時(shí)將自動(dòng)調(diào)用該類的(????? )
A.有參構(gòu)造函數(shù)????????????????????????????????????????? B.無參構(gòu)造函數(shù)
C.拷貝構(gòu)造函數(shù)?????????????????????????????????????????? D.賦值構(gòu)造函數(shù)
解析:P97 隱式調(diào)用無參構(gòu)造函數(shù)
正確答案:B
?
10.下面關(guān)于編寫異常處理代碼規(guī)則中不正確的是(? )
A. 可以有數(shù)量不限的catch處理程序出現(xiàn)在try塊之后,在try 塊出現(xiàn)之前不能出現(xiàn)catch塊。
B.? try塊中必須包含throw語句。
C. 在關(guān)鍵字catch之后的圓括號(hào)內(nèi)的數(shù)據(jù)聲明必須包括其類型聲明。
D.如果catch中處理程序執(zhí)行完畢,而無返回或終止指令將跳過后面的catch塊繼續(xù)執(zhí)行
解析:P290 try塊中不必須包含throw語句
正確答案:B
?
11.關(guān)于類和對(duì)象,下列說法不正確的是(???? )
A.對(duì)象是類的一個(gè)實(shí)例
B.任何一個(gè)對(duì)象必定屬于一個(gè)特定的類
C.一個(gè)類只能有一個(gè)對(duì)象
D.類與對(duì)象的關(guān)系類似于數(shù)據(jù)類型與變量的關(guān)系
解析:P92 一個(gè)類可以有多個(gè)對(duì)象
正確答案:C
?
12. 下列敘述中,不正確的是(???? )
A.類的構(gòu)造函數(shù)可以重載?????????? B.類的析構(gòu)函數(shù)可以重載
C.一個(gè)類可以不定義構(gòu)造函數(shù)?????? D.一個(gè)類可以不定義析構(gòu)函數(shù)
解析:P105 類的析構(gòu)函數(shù)不可以被重載
正確答案:B
?
13.關(guān)于靜態(tài)數(shù)據(jù)成員,下列描述正確的是(????? )
解析:
A:P117 靜態(tài)數(shù)據(jù)成員屬于類
B:P117 靜態(tài)成員只能訪問靜態(tài)成員,但靜態(tài)成員可以被非靜態(tài)成員訪問
C:P118 構(gòu)造函數(shù)中可以對(duì)靜態(tài)數(shù)據(jù)成員賦值
D:P117 靜態(tài)數(shù)據(jù)成員遵守訪問權(quán)限的限定規(guī)則
正確答案:A
?
14.下列對(duì)派生類的描述中,(????? )是錯(cuò)誤的。
解析:P144 派生類中繼承的基類成員的訪問權(quán)限和繼承方式有關(guān),不同繼承方式會(huì)不同程度地改變基類成員在派生類中的訪問權(quán)限
正確答案:D
?
15.關(guān)于虛函數(shù)的描述中,( ???)是正確的。
A..基類中說明了虛函數(shù)后,派生類中將其對(duì)應(yīng)的函數(shù)可不必說明為虛函數(shù)
B.虛函數(shù)是一個(gè)static類型的成員函數(shù)
C.虛函數(shù)是一個(gè)非成員函數(shù)
D.派生類的虛函數(shù)與基類的虛函數(shù)具有不同的參數(shù)個(gè)數(shù)和類型
A:P197 基類中說明了虛函數(shù)后,派生類中將其對(duì)應(yīng)的函數(shù)可不必說明為虛函數(shù)
B:虛函數(shù)不是一個(gè)static類型的成員函數(shù)
C:虛函數(shù)是一個(gè)成員函數(shù)
D:P197 派生類的虛函數(shù)與基類的虛函數(shù)具有相同的參數(shù)個(gè)數(shù)和類型
正確答案:A
?
16.下列敘述,不正確的是(???? )
解析:P202 一個(gè)基類中說明有純虛函數(shù),該基類的派生類如果覆蓋基類的純虛函數(shù),則派生類也是抽象類
正確答案:B
?
17.關(guān)于函數(shù)模板,描述錯(cuò)誤的是 (???? )
A.函數(shù)模板必須由程序員實(shí)例化為可執(zhí)行的函數(shù)模板
B.函數(shù)模板的實(shí)例化由編譯器實(shí)現(xiàn)。?????????? ?
C.一個(gè)類定義中,只要有一個(gè)函數(shù)模板,則這個(gè)類既可以是類模板,也可以是普通類
D.類模板的成員函數(shù)都是函數(shù)模板,類模板實(shí)例化后,成員函數(shù)也隨之實(shí)例化
解析:P255 成員函數(shù)模板當(dāng)編譯器遇到程序中對(duì)函數(shù)模板的調(diào)用是,由編譯器實(shí)例化為可執(zhí)行的模板函數(shù)
正確答案:D
?
18.在C++中,數(shù)據(jù)封裝要解決的問題是 (???? )
A.數(shù)據(jù)的規(guī)范化??????????????
B.便于數(shù)據(jù)轉(zhuǎn)換
C.避免數(shù)據(jù)丟失??????????????
D.防止不同模塊之間數(shù)據(jù)的非法訪問
解析:P83
正確答案:D
?
20.假定MyClass為一個(gè)類,則執(zhí)行MyClass a[3],*p[2];語句時(shí),自動(dòng)調(diào)用該類構(gòu)造函數(shù) (???? )次。
A.2 ??? B.3 ???? C.4????? D.5
解析:實(shí)例化3個(gè)MyClass對(duì)象
正確答案:B
?
21.對(duì)于下面的類MyClass,在函數(shù)f()中將MyClass對(duì)象的數(shù)據(jù)成員n的值修改為50的語句應(yīng)該是(???? )?
class MyClass{public:MyClass(int x) {n = x;}void SetNum(int n) {this->n = n;}private:int n;}int f( ){MyClass *ptr = new MyClass(45);}A.MyClass(50);????????????????? B.SetNum(50);
C.ptr->SetNum(50) ;????????????? D.ptr->n = 50;
解析:ptr是MyClass指針,n是private成員,所以不能直接訪問,只能通過SetNum()修改n的值
正確答案:C
?
22.友員運(yùn)算符_left>_right被C++編譯器解釋為(???? ?)
A.operator >(_left, _right)???????????? ?B. >(_left, _right)
C._right.operator >(_left)?????????????? D._left.operator >( _right)
解析:P229
重載為友元函數(shù)的運(yùn)算符的調(diào)用形式如下:?????
operator<運(yùn)算符>(<參數(shù)1>,<參數(shù)2>)?
等價(jià)于:<參數(shù)1><運(yùn)算符><參數(shù)2>?
正確答案:A
?
23.派生類的構(gòu)造函數(shù)的成員初始化列表中,不能包含(???? )
A.基類的構(gòu)造函數(shù)
B.派生類中子對(duì)象的初始化
C.基類中子對(duì)象的初始化
D.派生類中一般數(shù)據(jù)成員的初始化
解析:基類中子對(duì)象由基類初始化
正確答案:C
?
24.下面關(guān)于C++中類的繼承與派生的說法錯(cuò)誤的是(???? )
A.基類的protected成員在公有派生類的成員函數(shù)中可以直接使用
B.基類的protected成員在私有派生類的成員函數(shù)中可以直接使用
C.私有派生時(shí),基類的所有成員訪問權(quán)限在派生類中保持不變
D.繼承可以分為單一繼承與多重繼承
A:P144 基類的protected成員在公有派生類的成員函數(shù)中是protected的,所以可以直接使用
B:P144 基類的protected成員在公有派生類的成員函數(shù)中是private的,所以可以直接使用
C:P147 基類的所有成員訪問權(quán)限在派生類中根據(jù)派生類型的不同,派生類的成員訪問權(quán)限會(huì)發(fā)生改變
D:P142 繼承可以分為單一繼承與多重繼承
正確答案:C
?
25.下列關(guān)于虛基類的描述中,錯(cuò)誤的是(???? )
A.虛基類子對(duì)象的初始化由最終的派生類完成
B.虛基類子對(duì)象的初始化次數(shù)與虛基類下面的派生類個(gè)數(shù)有關(guān)
C.設(shè)置虛基類的目的是消除二義性
D.帶有虛基類的多層派生類構(gòu)造函數(shù)的成員初始化列表中都要列出對(duì)虛基類構(gòu)造函數(shù)的調(diào)用
解析:
A:P174 虛基類子對(duì)象的初始化由最終的派生類完成
B:P172 虛基類子對(duì)象只初始化一次
C:P171 虛基類的目的是消除二義性
D:P174 派生類都應(yīng)該在其構(gòu)造函數(shù)初始化列表中為為虛基類構(gòu)造函數(shù)提供初始值(不管虛基類是它的直接基類,還是間接類)
正確答案:B
?
26.關(guān)于虛函數(shù)的描述中正確的是(???? )
A.虛函數(shù)是一個(gè)static類型的成員函數(shù)
B.虛函數(shù)是一個(gè)非成員函數(shù)
C.虛函數(shù)既可以在函數(shù)說明時(shí)定義,也可以在函數(shù)實(shí)現(xiàn)時(shí)定義
D.派生類的虛函數(shù)與基類的虛函數(shù)具有相同的參數(shù)個(gè)數(shù)和類型
解析:
A:虛函數(shù)不是一個(gè)static類型的成員函數(shù)
B:虛函數(shù)是一個(gè)成員函數(shù)
C:虛函數(shù)必須在函數(shù)說明時(shí)定義,純虛函數(shù)可以既可以在函數(shù)說明時(shí)定義,也可以在函數(shù)實(shí)現(xiàn)時(shí)定義
D:P197 派生類的虛函數(shù)與基類的虛函數(shù)具有相同的參數(shù)個(gè)數(shù)和類型
正確答案:D
?
27.關(guān)于純虛函數(shù)和抽象類的描述中錯(cuò)誤的是(????? )
A.純虛函數(shù)是一種特殊的虛函數(shù),它沒有具體的實(shí)現(xiàn)
B.抽象類是指具有純虛函數(shù)的類
C.一個(gè)基類中說明有純虛函數(shù),該基類的派生類一定不再是抽象類
D.抽象類只能作為基類來使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出
解析:P202 一個(gè)基類中說明有純虛函數(shù),該基類的派生類如果未覆蓋基類的純虛函數(shù),則派生類也是抽象類
正確答案:C
?
28.下列對(duì)模板的聲明,正確的是(? )
A.template<T>
B.template<typename T1,T2>
C.template<typename T1,class T2>
D.template<typename T1;typename T2>
解析:P254
正確答案:C
?
29. 已定義了一個(gè)類A并有語句A* pa=new A(5); 那么以下說法正確的是:
A. 該語句會(huì)創(chuàng)建A類的一個(gè)對(duì)象,并將此對(duì)象的地址賦給指針pa;
B. 該語句會(huì)創(chuàng)建A類的5個(gè)對(duì)象,且它們的地址是連續(xù)的;
C. 當(dāng)指針變量pa超出其作用域時(shí),pa和為對(duì)象分配的空間都將被自動(dòng)釋放;
D. 類A中一定有一個(gè)顯式定義的構(gòu)造函數(shù)和一個(gè)顯式定義的虛析構(gòu)函數(shù);
解析:
A:創(chuàng)建A類的對(duì)象
B:只會(huì)創(chuàng)建一個(gè)A類的對(duì)象
C:new定義的對(duì)象需要delete釋放內(nèi)存空間
D:一定有顯示定義的構(gòu)造函數(shù),但不一定有顯示定義的虛析構(gòu)函數(shù)
正確答案:A
?
30. 定義類A的非靜態(tài)成員函數(shù)A& f(A& one)時(shí),需有語句return exp;則exp不能是:
A.類A中類型為A的靜態(tài)數(shù)據(jù)成員
B. f中用語句A a = one; 定義的量a
C. one
D. *this
解析:a是臨時(shí)數(shù)據(jù)成員,不能返回引用
正確答案:B
?
31. 在一個(gè)類中,下列哪些成員可以是多個(gè)?
A. 無參構(gòu)造函數(shù)
B. 析構(gòu)函數(shù)
C. 原型相同的非靜態(tài)成員函數(shù)
D. 靜態(tài)成員函數(shù)
解析:
正確答案:D
?
32. 對(duì)類T中的下列成員,若不考慮代碼優(yōu)化,一般來說它們中的哪個(gè)執(zhí)行起來最慢?
A. 缺省的無參構(gòu)造函數(shù)
B. 缺省的拷貝構(gòu)造函數(shù)
C. T f( ) { T t; return t; }
D. 不能判定A、B、C哪個(gè)最慢
解析:既要調(diào)用成員函數(shù)f(),又要調(diào)用缺省的無參構(gòu)造函數(shù)
正確答案:C
?
33. 對(duì)函數(shù)原型為int& min(int& a, int& b);的全局函數(shù),下列語句塊哪個(gè)是錯(cuò)誤的:
A. int x=10,y=5; min(x,y)=100;
B. int x=10,y=5, z; z=min(x,y+=x);
C. int x=10,y=5; min(x,10)=y;
D. int x=10,y=5; x=min(x,y);
解析:
正確答案:C
?
34. 關(guān)于拷貝構(gòu)造函數(shù)錯(cuò)誤的說法有:
A. 拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),且不能在類中進(jìn)行函數(shù)重載。
B. 若自定義派生類的拷貝構(gòu)造函數(shù),那么也必須自定義基類的拷貝構(gòu)造函數(shù)。
C. 通常拷貝構(gòu)造函數(shù)只能有一個(gè)參數(shù),且為常量引用或非常量引用。
D. 拷貝構(gòu)造函數(shù)不允許在函數(shù)體中使用return語句。
解析:
A:P112 拷貝構(gòu)造函數(shù)不能在類中進(jìn)行函數(shù)重載
B:P110 P162 無論基類的拷貝構(gòu)造函數(shù)是自定義和合成的版本,都可以執(zhí)行
C:P110 通常拷貝構(gòu)造函數(shù)可以只能有一個(gè)參數(shù),是對(duì)同類的某個(gè)對(duì)象的引用
D:P96 構(gòu)造函數(shù)沒有返回類型,即不允許在函數(shù)體重使用return語句
正確答案:B
?
35. 下列對(duì)虛基類聲明正確的是:
A. class virtual B: public A
B. class B: virtual public A
C. class B: public A virtual
D. virtual class B: public A
解析:P171
正確答案:B
?
36. 若有語句A*const p=new B;,其中類B是從類A直接派生得到的,那么下列說法錯(cuò)誤的是:
A. 若要執(zhí)行語句p->f( );,那么類A中一定有一個(gè)與f( )函數(shù)匹配的函數(shù)聲明。
B. 類B一定是通過public繼承方式從類A派生的。
C. 類B的構(gòu)造函數(shù)中,至少有一個(gè)無參的或提供全部缺省參數(shù)的構(gòu)造函數(shù)。
D. 通過指針p,只能訪問類中的常量成員函數(shù)或靜態(tài)成員函數(shù)。
解析:
A:P164 p是基類指針,所以只能訪問B中基類部分
B:P144 非public基礎(chǔ)方式會(huì)改變構(gòu)造函數(shù)的訪問權(quán)限,導(dǎo)致不能實(shí)例化對(duì)象
C:類B要實(shí)例化必須有一個(gè)無參的或提供全部缺省參數(shù)的構(gòu)造函數(shù)
D:P164 通過指針p,可以訪問基類中的public訪問權(quán)限成員函數(shù)或者數(shù)據(jù)成員
正確答案:D
?
37. 下面說明的哪個(gè)數(shù)據(jù)不能作為類T的數(shù)據(jù)成員定義。
A. T* pT
B. class Q{ } q1,q2;
C. static T t;
D. const T t;
解析:
A:可以定義是本類的指針
B:類T中可以定義新的類Q
C:可以創(chuàng)建本類靜態(tài)對(duì)象
D:不可以定義本類對(duì)象常量
正確答案:D
?
38. 下列哪種運(yùn)算符可以被重載:
A. sizeof ?????? B. :: ?????? C. ? : ???? D. [ ]
解析:P222
正確答案:D
?
- 程序改錯(cuò)題,指出程序中的錯(cuò)誤語句并分析錯(cuò)誤原因
所有錯(cuò)誤都是基于原程序,非糾正的程序
1. 指出下面程序段中的錯(cuò)誤,并說明出錯(cuò)原因
class X{private:int a=0;??????????????????? //A行int &b;?????????????????? //B行 引用必須在定義時(shí)初始化或者在構(gòu)造函數(shù)賦初值const int c;??????????????? //C行 常量必須在定義時(shí)初始化或者在構(gòu)造函數(shù)賦初值void setA(int i){a=i;}??????? //D行 setA()函數(shù)應(yīng)該定義為public訪問權(quán)限X(int i){a=i;}????????????? //E行 X(int i)構(gòu)造函數(shù)應(yīng)該定義為public訪問權(quán)限,并且b和c必須在初始化列表里賦初值public:int X():b(a),c(a){a =0;}??????????????? //F行 構(gòu)造函數(shù)沒有返回類型X(int i,int j,int k):b(j),c(k){a=i; }???? //G行static void setB(int k){b=k;}??????? //H行 靜態(tài)成員不能訪問非靜態(tài)成員setC(int k)const {c=c+k;}????????? //I行 沒有返回值類型 不能修改常量成員};void main(){X x1;??????????????? //J行X x2(3);???????????? //K行 此構(gòu)造函數(shù)是私有的X x3(1,2,3);????????? //L行x1.setA(3);?????????? //M行 SetA()函數(shù)是私有}P138 習(xí)題3-8
2.指出下面程序段中的錯(cuò)誤,并說明出錯(cuò)原因
#include<iostream>using namespace std;class Base1 {int b1;????????????????????????????????????????????? //A行public:Base1(int b1=0) {this->b1=b1;}???????????????????????? //B行void f(){ cout<<"From? Base1"<<endl;}???????????????? //C行};class Base2 {int b2;???????????????????????????????????????????? //D行public:Base2(int b2){this->b2=b2;}?????????????????????????? //E行void f() { cout<<"From? Base2"<<endl;}??????????????? //F行};class Derived: public Base1, public Base2 {?????????????????? //G行int d;public:Derived(int d){this->d=d;}??????????????????????????? //H行 基類Base2沒有無參構(gòu)造函數(shù),只能調(diào)用有參構(gòu)造函數(shù)void g(){ cout<<"From? Derived"<<b1<<b2<<endl; } ?????//I行 b1和b2是private的,不能直接訪問};void main(){Derived dObj(10);?????????????????????????????????? //J行dObj.f();?????????????????????????????????????????? //K行 f()存在二義性必須指定函數(shù)dObj.Base1::f();???????????????????????????????????? //L行}3.指出下面程序段中的錯(cuò)誤,并說明出錯(cuò)原因(6分)#include<iostream.h>class A{??? int a;public:A(int x){ a=x; }?????? //A行};class B:public A??????????? //B行{??? int a;public:B(int x){ a=x; }?????? //C行 基類A沒有無參構(gòu)造函數(shù),只能調(diào)用有參構(gòu)造函數(shù)void show(){cout<<a<<'\t'<<A::a<<endl; }??? //D行 需要添加命名空間std?? a在基類A中是private的,不能直接訪問};void main(){??? B b1;????????????????? //E行 類B沒有無參構(gòu)造函數(shù),只能調(diào)用有參構(gòu)造函數(shù)b1.show();????????????? //F行}- 閱讀程序,寫出程序的運(yùn)行結(jié)果
1.
#include<iostream>using namespace std;class Implementation{public:Implementation(int y){value=y;}void setValue(int v){value=v;}int getValue() const {return value;}private:int value;};class Interface{public:Interface(int);void setValue(int);int getValue() const;private:Implementation *ptr;};Interface::Interface(int v):ptr(new Implementation(v)){}void Interface::setValue(int v){ptr->setValue(v);}int Interface::getValue() const {return ptr->getValue();}void main(){Interface i(5);cout<<i.getValue()<<endl;i.setValue(10);cout<<i.getValue()<<endl;}2.
#include<iostream>using namespace std;class B1{public:B1(int a){cout<<"constructing B1 "<<a<<endl;}};class B2:public B1{public:B2(int b,int a):B1(a){cout<<"constructing B2 "<<b<<endl;}};class B3:public B2{public:B3(int a,int b,int c,int d,int e):B2(a,b),memberB2(c,d),memberB1(e){cout<<"constructing B3"<<endl;}private:B1 memberB1;B2 memberB2;};void main(){B3 b3(1,2,3,4,5);}3.
#include<iostream.h>class Character{char i;public:Character (char a=0){i =a; }Character operator ++();Character operator ++(int);void print(){cout<<i<<endl;}};Character Character::operator ++(){i++;return*this;}Character Character::operator ++(int){Character j;j.i=i++;return j;}void main(){Character? x(65), y(98), z;z = ++x;x.print();z.print();z = y++;y.print();z.print();}4.
#include <iostream>using namespace std;enum errs{error0,error1};double Divide(double test1, double test2){??try{if(test2==0) throw error0;if(test2>=1000) throw error1;}catch(errs er){switch(er){????case error0:cout<<"除數(shù)不能為0!"<<endl;break;case error1:cout<<"除數(shù)太大!"<<endl;break;}???????????}return test1/test2;}void main(){cout<<Divide(2,0)<<endl;cout<<Divide(1,1000)<<endl;}5.
#include<iostream.h>class Sample{int n;static int sum;public:Sample(int x){n=x; }void add(){sum+=n;}void disp(){cout << “n=” << n << “,sum=” << sum << endl;}};int Sample::sum=0;//靜態(tài)數(shù)據(jù)成員賦初值void main(){Sample a(2),b(3),c(5);a.add();a.disp();b.add();b.disp();c.add();c.disp();}?
6.
#include <iostream>using namespace std;class B {public:B(){ cout<<"Constructing B"<<endl;}};class B1:virtual public B {public:B1(int i){ cout<<"Constructing B1"<<endl; }};class B2:virtual public B {public:B2(int j){ cout<<"Constructing B2"<<endl; }};class D: public B1, public B2 {public:D(int m,int n): B1(m),B2(n){ cout<<"Constructing D"<<endl; }};void main(){D d(1,2);}7.
#include <iostream.h>class MEMBER {public:virtual void answer(){cout << "I am a member.\n";}};class TEACHER: public MEMBER {public:void answer(){cout << "I am a teacher.\n";}};class STUDENT: public MEMBER {public:void answer(){cout << "I am a student.\n";}};void main(){MEMBER member;?????????????????????????????????TEACHER teacher;??????????????????????????STUDENT student;????????????????????MEMBER* who;??????????????????????????????who = &member;who->answer();who = &teacher;who->answer();who = &student;who->answer();}8.
#include<iostream>using namespace std;class A{protected:int a;public:A(int x){a=x;}virtual void show(){? cout<<a++<<"\n";? }void print() { cout<<++a<<"\n";? }};class B:public A{public:B(int x):A(x){}void show(){? cout<<a--<<"\n";? }void print() { cout<<--a<<"\n";? }};void main(){?? A a(5),*p;B b(10);p=&a; p->show(); p->print();p=&b; p->show(); p->print();}?
9.
# include <iostream>using namespace std;class MyClass{public:MyClass();void print();~MyClass();private:int i;static int j;};int MyClass::j = 0;MyClass::MyClass(){cout<<"This is a constructor"<<endl;j += 10;}void MyClass::print(){cout<<"The value of j is"<<j<<endl;}MyClass::~MyClass(){cout<<"This is a destructor!"<<endl;}void main(){MyClass first,second;first.print();second.print();}?
10.
#include<string>#include<iostream>using namespace std;class Dog{string name;int age;public:Dog(string name,int age):name(name),age(age){cout<<"invoking Dog constructor"<<endl;}Dog(const Dog& dog):name(dog.name),age(dog.age){cout<<"invoking Dog copy constructor"<<endl;}};class Person{string name;Dog dog;public:Person(string name,Dog dog):name(name),dog(dog){cout<<"invoking Person constructor"<<endl;}};int main(){Dog dog("Fido",4);Person p1("zaphod",dog);Person p2 = p1;return 0;}11.
#include <iostream>using namespace std;class A {int a;public:A(int i){ cout<<"Constructing A "<<i<<endl; }};class B {public:B(){ cout<<"Constructing B "<<endl;}};class B1: public B ,virtual public A{public:B1(int i):A(i){ cout<<"Constructing B1 "<<i<<endl; }};class B2:virtual public A,public B {public:B2(int j):A(j){ cout<<"Constructing B2 "<<j<<endl; }};class D: public B1, public B2 {public:D(int m,int n): B1(m),B2(n),a(3),A(4){ cout<<"Constructing D"<<endl; }A a;};void main(){D d(1,2);}?
12.
# include <iostream>using namespace std;class Base{protected:int n;public:Base(int m){n=m++;}virtual void g1(){cout<<"Base::g1()..."<<n<<endl;g4();}virtual void g2(){cout<<"Base::g2()..."<<++n<<endl;g3();}virtual void g3(){cout<<"Base::g3()..."<<++n<<endl;g4();}virtual void g4(){cout<<"Base::g4()..."<<++n<<endl;}};class Derive: public Base{int j;public:Derive (int n1,int n2):Base(n1){j=n2;}void g1(){cout<<"Deri::g1()..."<<++n<<endl;g2();}void g3(){cout<<"Deri::g2()..."<<++n<<endl;g4();}};void main(){Derive Dobj(1,0);Base Bobj=Dobj;Bobj.g1();Base &bobj2=Dobj;bobj2.g1();}13.
#include <iostream.h>class A {public:A(int anInt = 0 ):i(anInt){cout << "A::A( )" << endl;}A(const A& anA){cout << “A::A(const A&)” << endl;i = anA.i;}int getI( ) const{return i;}~A( ){cout << "A::~A( )" << endl;}private:int i;};class B{public:B( ){cout << "B::B( )" << endl;}B(const A& anA): a(anA){cout << "B::B(constA&) " << endl;}virtual void f( ){cout << "B::f( )" << endl; cout << a.getI( ) << endl;}virtual ~B( ){cout <<"B::~B( )"<<endl;}private:A a;};class D : public B{public: D( ){cout << "D::D( )" << endl;}D(const A& anA): a(anA){cout << "D::D(constA&)" << endl;}void f( ){B::f( ); cout << "D::f( )" << endl; cout << a.getI( ) << endl;}~D( ){cout << "D::~D( )" << endl;}private: A a;};void main( ){A a(10);B* pB = new D(a);pB->f( );delete pB;}?
- 程序填空題
1.在橫線處填上適當(dāng)?shù)淖志?#xff0c;完成下面復(fù)數(shù)類的定義(4分)。
#include<iostream.h>class Complex{private:double real,image;public:Complex(double r=0,double i=0) {real=r;image=i;}friend Complex operator+(Complex &a,const Complex &b);?? //復(fù)數(shù)加法運(yùn)算符Complex operator=(Complex c);???????????????????????? //復(fù)數(shù)賦值運(yùn)算符};Complex operator+(Complex &a,const Complex &b){Complex*t=new Complex(_ a.real+b.real , a.image+b.image__);return *t;}Complex Complex::operator=(Complex c){real=c.real;image=c.image;return? *this ;}?
2.下列程序用虛函數(shù)print和運(yùn)行的多態(tài)性,把從鍵盤輸入的一個(gè)int型數(shù)值n,按八進(jìn)制和十六進(jìn)制輸出,完善程序(8分)。
#include<iostream.h>class OCT{protected:???int n;public:OCT(int x){ n=x; }_void virtual print()_{ cout<<n<<"的八進(jìn)制為:"<<oct<<n<<endl; }};class HEX:public OCT{public:HEX(int x): OCT(x){ }__void print(){ cout<<n<<"的十六進(jìn)制為:"<<hex<<n<<endl; }};void main(){?? int n;cout<<"請(qǐng)輸入一個(gè)十進(jìn)制:";cin>>n;OCT oc(n);HEX he(n);_OCT *p_;p=&oc;p->print();_p=&he_;p->print();}?
3.在橫線處填上適當(dāng)?shù)恼Z句,完成下列程序
#include<iostream>#include<cmath>using namespace std;class Point{public:Point(double a,double b,double c){x=a,y=b,x=c;??? ??}double getX(){return x;}double getY(){return y;}double getZ(){return z;}private:double x; ?????protected:double y,z; ????};class Line:Point{public:Line(double a,double b,double c,double d)? : Point(a,b,c)? ?{k=d;??? ????}void show(){cout<<getX()<<endl;cout<<getY()<<” ”<<y<<endl;cout<<getZ()<<” ”<<z<<endl;cout<<k<<endl;}private:double k;};int main(){Line obj(1.2,3.4,5.6,7.8);obj.show();return 0;}?
4.本程序自定義了一個(gè)復(fù)數(shù)類Complex類和一個(gè)求最小值的函數(shù)模板min,在橫線處填上適當(dāng)?shù)恼Z句,使得該程序的運(yùn)行結(jié)果為:
hello
1+2i
#include<iostream>#include<string>#include<complex>using namespace std;class Complex{private:int real;int image;public:Complex(int,int);bool operator<(Complex c);friend ostream &operator<<(? ostream &os , Complex obj ) ;};Complex::Complex(int real = 0,int image = 0){this->real = real;this->image = image;}bool Complex::operator <(Complex c){if( real<=c.real&&image<c.image ?)return true;else return false;}ostream & operator<<( ?ostream &os , Complex obj? ?){os<<obj.real<<”+”<<obj.image<<”i”<<endl;? ;return os;}template<typename T>?T _min(T _left, T _right){return _left < _right ? _left : _right;}int main(){string str1 = "hello";string str2 = "hollow";cout<<_min(str1,str2)<<endl;Complex c1(1,2),c2(3,4);cout<<_min(c1,c2);return 0;}?
5.在橫線處填上適當(dāng)?shù)恼Z句,利用異常處理機(jī)制合理得處理由主函數(shù)的兩條調(diào)用語句導(dǎo)致的異常,使得:
當(dāng)調(diào)用語句為cout<<Divide(2,0)<<endl;時(shí),輸出結(jié)果為:除數(shù)不能為0!
當(dāng)調(diào)用語句為cout<<Divide(1,1000)<<endl;時(shí),輸出結(jié)果為:除數(shù)太大!
當(dāng)調(diào)用語句為cout<<Divide(1,2)<<endl;時(shí),輸出結(jié)果為:0.5
#include <iostream>using namespace std;enum errs{error0,error1};double Divide(double dividend, double divided){??if(divided == 0)? ??throw( error0 ) ???;else if(divided >= 1000)? ???throw( error1 ) ??;else ????cout<<dividend/divided<<endl? ????;}void main(){try{cout<<Divide(2,0)<<endl;cout<<Divide(1,1000)<<endl;cout<<Divide(1,2)<<endl;}catch( errs er ){switch(er){????case error0:cout<<"除數(shù)不能為0!"<<endl;break;case error1:cout<<"除數(shù)太大!"<<endl;break;}???????????}}- 程序設(shè)計(jì)題
1.(10分)定義一個(gè)大學(xué)生類student,函數(shù)私有數(shù)據(jù)成員:姓名、學(xué)號(hào)、校名,并為它定義帶參數(shù)的構(gòu)造函數(shù)、參數(shù)帶缺省值的構(gòu)造函數(shù)和輸出數(shù)據(jù)成員值的print()公有成員函數(shù),另定義研究生類,它以公有繼承方式派生于類student,新增加“研究方向、導(dǎo)師名”兩個(gè)私有數(shù)據(jù)成員,并定義帶參數(shù)的構(gòu)造函數(shù)和輸出研究生數(shù)據(jù)的print()公有成員函數(shù)。在main()函數(shù)中定義基類和派生類對(duì)象,對(duì)類進(jìn)行測(cè)試。
主函數(shù)的測(cè)試程序如下:
void main(){Student stu1("Li","1600141","XingJiang University");stu1.print();GraStudent gstu("Wang","1600240","XJUniversity","Computer","Zhang");gstu.print();}程序運(yùn)行輸出結(jié)果如下:name=LiStuNum=1600141universty_name=XJUname=WangStuNum=1600240universty_name=XJUspecial is Computedirector is Zhang?
2. 定義一個(gè)圓類,數(shù)據(jù)成員有顏色、圓心坐標(biāo)、半徑;成員函數(shù)有構(gòu)造函數(shù)(有四個(gè)參數(shù)),設(shè)置圓的各種參數(shù),顯示圓的各種參數(shù),計(jì)算圓的面積和周長(zhǎng),并編寫一個(gè)主函數(shù)對(duì)所定義的圓類進(jìn)行測(cè)試。(12分)
?
3. 定義一個(gè)點(diǎn)類(Point)、矩形類(Rectangle)和立方體類(Cube)的層次結(jié)構(gòu)。Point為基類,成員有點(diǎn)的x坐標(biāo)和y坐標(biāo);Rectangle包括長(zhǎng)度和寬度兩個(gè)新數(shù)據(jù)成員,Rectangle的位置從Point類繼承。Cube類的數(shù)據(jù)成員包括長(zhǎng)度、寬度和高度,長(zhǎng)度和寬度從Rectangle類繼承。要求各類提供支持初始化的構(gòu)造函數(shù)和顯示自己成員的成員函數(shù)。編寫主函數(shù),測(cè)試這個(gè)層次結(jié)構(gòu),輸出立方體類的相關(guān)信息。(12分)
?
4.(共20分,每問題10分) 某程序員為了靈活地對(duì)各種的給定的曲線函數(shù)f(x)畫出其曲線圖形,設(shè)計(jì)并部分實(shí)現(xiàn)了一個(gè)曲線類curve,該類的成員數(shù)據(jù)中,count代表坐標(biāo)點(diǎn)的個(gè)數(shù),pxs代表的數(shù)組存放這些坐標(biāo)點(diǎn)的橫坐標(biāo),pys代表的數(shù)組存放利用f(x)計(jì)算得到的這些坐標(biāo)點(diǎn)的縱坐標(biāo)。由于不同曲線的計(jì)算公式f(x)是不同的,該程序員希望曲線函數(shù)的種類可以通過繼承curve類的方式任意增加,增加一個(gè)新的f(x)時(shí)不改變curve類中的內(nèi)容,也不改變利用curve類進(jìn)行圖形繪制的算法。已部分完成的curve類定義和實(shí)現(xiàn)如下:
class? curve? {public:void setPxs( ) {/*把獲取的橫坐標(biāo)數(shù)據(jù)存放在pxs代表的數(shù)組中,并為count置值*/ }double* getPxs( ) const { return pxs;}int getCount( ) const { return count;}double* getPys( ) const ;private:double* pxs;double* pys;int count};請(qǐng)按照該程序員的設(shè)計(jì)意圖給出成員函數(shù)getPys的完整實(shí)現(xiàn)。實(shí)現(xiàn)過程中,可以為curve類增加其它成員。可以假設(shè)setPxs函數(shù)已經(jīng)完整實(shí)現(xiàn),不需要考慮曲線的繪制和顯示。
?
5. (共10分)定義一個(gè)抽象類Stereo,包含純虛函數(shù)Volume(用來計(jì)算體積)。然后派生出立方體Cube類、圓球體Sphere類、圓柱體Cylinder類,分別求其體積。各立體形狀的相關(guān)數(shù)據(jù)通過各類的構(gòu)造函數(shù)設(shè)置。total( )則是一個(gè)通用的用以求不同立體形狀的體積總和的全局函數(shù)。(圓球體的體積公式為 V=4/3*PI*R*R*R)。
??? 1)請(qǐng)根據(jù)下面主函數(shù)代碼,給出各個(gè)類的定義和實(shí)現(xiàn)。
??? 2)請(qǐng)根據(jù)下面主函數(shù)代碼,給出total( )函數(shù)的定義和實(shí)現(xiàn)。
void main( ) {Stereo* s[3];s[0]=new Cube(5.0,5.0,8.0);????? //實(shí)參為立方體的長(zhǎng)、寬、高s[1]=new Sphere(6.0);????????????? //實(shí)參為圓球體的半徑s[2]=new Cylinder(5.0,8.0);?????? //實(shí)參為圓柱體的底面半徑、高float sum=total(s,3);cout<<sum<<endl;for(int i=0;i<3;i++)? delete s[i];}?
總結(jié)
以上是生活随笔為你收集整理的浙江理工大学-2018-2019学年面向对象程序设计A-期末复习资料的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注册表模板-OEM信息自定义
- 下一篇: [AHOI2005]COMMON 约数研