刷刷筆試題 (6) C

2021-07-13 03:15:14 字數 4869 閱讀 3052

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

classa

virtualvoidfunc()

public:

intm_ival;

};

classb :publica

virtualvoidfunc()

};

intmain(intargc ,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

structone

structtwo

在#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

usingnamespacestd;

classa;

classb:publica;

classc:privateb;

intmain()

解析:類的繼承後方法屬性變化:

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位的學生...