1.以下程式輸出結果是____
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class
a
virtual
void
func()
public
:
int
m_ival;
};
class
b :
public
a
virtual
void
func()
};
int
main(
int
argc ,
char
* argv)
正確答案: c
a.1 0
b.0 1
c.0 1 2
d.2 1 0
e.不可預期
f.以上都不對
解析:本問題涉及到兩個方面:
1.c++繼承體系中建構函式的呼叫順序。
2.建構函式中呼叫虛函式問題。
c++繼承體系中,初始化時建構函式的呼叫順序如下
(1)任何虛擬基類的建構函式按照他們被繼承的順序構造
(2)任何非虛擬基類的建構函式按照他們被繼承的順序構造
(3)任何成員物件的函式按照他們宣告的順序構造
(4)類自己的建構函式
據此可知 a*p = newb;先呼叫a類的建構函式再呼叫b類的建構函式。
建構函式中呼叫虛函式,虛函式表現為該類中虛函式的行為,
即在父類建構函式中呼叫虛函式,虛函式的表現就是父類定義的函式的表現。why?原因如下:
假設建構函式中呼叫虛函式,表現為普通的虛函式呼叫行為,即虛函式會表現為相應的子類函式行為,並且假設子類存在乙個成員變數int a;子類定義的虛函式的新的行為會操作a變數,在子類初始化時根據構造函式呼叫順序會首先呼叫父類建構函式,那麼虛函式回去操作a,而因為a是子類成員變數,這時a尚未初始化,這是一種危險的行為,作為一種明智的選擇應該禁止這種行為。所以虛函式會被解釋到基類而不是子類。
2.下面兩個結構體 1
2
3
4
5
6
7
8
9
10
struct
one
struct
two
在#pragma pack(4)和#pragma pack(8)的情況下,結構體的大小分別是
則類classa的建構函式和析構函式的執行次數分別為( 5,1 )
class a *pclassa=newclassa[5]; new了五個物件,所以構造5次,然後pclass指向這五個物件
deletepclassa; 析構一次,deletepclassa 這樣就析構5次
這邊考察delete和delete 的區別。
delete和delete都能釋放指標所指向的記憶體區域。
但delete只會呼叫一次析構函式,而delete還會呼叫後續所有物件的析構函式。
當資料型別為基本資料型別時,用delete和delete都可以,因為基本資料型別沒有析構函式。
4.[例]下列選項哪些是正確的(d)
a.對於unordered_map和map這兩個容器,迭代器的有效性皆不受刪除操作影響
b.對於unordered_map和map這兩個容器,迭代器的有效性皆不受插入操作影響
c.為了保證**的異常安全性,應該避免在建構函式中拋異常
d.為了保證**的異常安全性,應該避免在析構函式中拋異常
a選項:當unorder_map和map某迭代器it指向的元素被刪除時,只有該迭代器it失效,其他的迭代器不會失效。
b選項:map插入時不會引起迭代器失效;unorder_map插入時一般情況下不會引起迭代器失效,只有當容器增長到需要rehash時,原來的所有迭代器失效。
c選項:建構函式丟擲異常後,已經構造的成員物件會被逆序析構,申請的記憶體資源會被系統釋放,不會呼叫析構函式。而且建構函式丟擲異常是唯一表明構造失敗的方法。
d選項:effective c++「條款08:
別讓異常逃離析構函式」
指出來如果析構函式丟擲異常,對於vector這樣的乙個物件陣列,如果第乙個widget析構有異常丟擲,這時候還要銷毀陣列中剩下的widget否則會造成記憶體洩漏,但是如果剩下的widget析構時也丟擲異常,就會兩個異常同時存在,程式如果不是結束執行就會產生不明確行為。即使不是使用容器或陣列,在析構函式中丟擲異常也可能導致程式過早結束或不明確行為。
5.下列程式編譯時會出現錯誤,請根據行號選擇錯誤位置( )
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include
using
namespace
std;
class
a;
class
b:
public
a;
class
c:
private
b;
int
main()
解析:類的繼承後方法屬性變化:
private 屬性不能夠被繼承。
使用private繼承,父類的protected和public屬性在子類中變為private;
使用protected繼承,父類的protected和public屬性在子類中變為protected;
使用public繼承,父類中的protected和public屬性不發生改變;
private, public, protected 訪問標號的訪問範圍:
private:只能由1.該類中的函式、2.其友元函式訪問。
不能被任何其他訪問,該類的物件也不能訪問。
protected:可以被1.該類中的函式、2.子類的函式、以及3.其友元函式訪問。
但不能被該類的物件訪問。
public:可以被1.該類中的函式、2.子類的函式、3.其友元函式訪問,也可以由4.該類的物件訪問。
注:友元函式包括3種:設為友元的普通的非成員函式;設為友元的其他類的成員函式;設為友元類中的所有成員函式。 1
2
3
4
5
cout
刷刷筆試題 (2)
1 四個平面最多把三維空間分成幾個部分?15 知識點 n 2 1 15 這個問題等價於 乙個西瓜切4刀,假設在此過程中西瓜不散落,則最多可以切成幾塊?前3刀沿橫 縱 豎三個方向切成8塊應該沒有問題,第4刀怎麼切呢?要得到最多的塊數,應該盡可能切到前8塊,所以切法應該區別於前3刀的方向,即斜切,但總有...
刷刷筆試題 概率
1.馬路上有編號1,2,3.10的十盞路燈,為節約用電而又不影響照明,可以把其中3盞燈關掉,但不可以同時關掉相鄰的兩盞,在兩端的燈都不能關掉的情況下,有 種不同的關燈方法。答 採用插隔板法,即8燈關3,餘5燈亮,5燈之間6個空,插入3盞不亮燈即c 6,3 2.房間裡有8人,分別佩戴著從1號到8號的紀...
刷刷筆試題 sql
1.資料庫中有學院表和成績表 學院表t school結構如下 學院id school id,學院名稱 school name 成績表t score結構如下 學號 id.姓名 name,分數 score,學院id school id 請用sql語句查詢出學院名稱為 計算機系 的分數最高的前20位的學生...