c 筆試題總結2

2021-07-10 02:02:41 字數 3354 閱讀 9643

1. in c++, what does "explicit" mean?

答:explicit用在構造器上,防止某些隱式轉換。比如下面的例子:

#include #include using std::cout;

using std::endl;

using std::string;

class cls

};void printstr(cls obj)

void main(void)

2. 下面**的列印結果是什麼?

#include using std::cout;

using std::endl;

class cls

~cls()

void print()

};int cls::num = 0;

cls f(cls x)

void main(void)

答:具體的列印結果如下:

num: 1

num: 0

num: 0

----

num: -1

num: -2

這裡主要考察的是拷貝建構函式和析構函式,普通建構函式也考了,不過不是重點。

首先要說明拷貝建構函式發生在哪些情況下:1)使用乙個類初始化另乙個類時;2)將類作為值引數進行傳遞時;3)將類作為值返回時。

本題就符合上述的123三種情況;因此在f()函式中發生2次拷貝建構函式的呼叫,又因為在函式當中,中間的1個臨時變數在函式結束後就消失了,因此還會呼叫析構函式,因此會有1次列印;而第3次就是c2.print()。有一點比較奇怪,這裡的類初始化和值返回都出現了,但是只有一次拷貝。

上述結果中,第1次列印來自c1.print();第2次列印是析構函式的呼叫;第三次列印是c2.print();最後兩次是因為main函式結束後,需要釋放c1和c2,所以還要呼叫兩次析構。

上面的**還可以修改一下,來考察賦值建構函式和拷貝建構函式:

#include using std::cout;

using std::endl;

class cls

cls(cls &c)

cls & operator=(cls &cls)

~cls()

void print()

};int cls::num = 0;

cls f(cls x)

void main(void)

列印的結果如下:

num: 1

copy

copy

num: 1

operator

num: 0

num: 0

----

num: -1

num: -2

3. 在c++程式設計中,傳值方式和傳引用方式之間有什麼區別?

答:二者的區別為,當傳引用時,實際傳到函式中的形參,是實際引數的乙個引用,而不是僅傳遞值到函式中。具體的表現有以下幾條:

1 傳引用時,形參和實參是同乙個變數,即使用相同的記憶體空間,二者有相同的位址。而傳值時二者位址不同;

2 傳引用時,由於沒有新建變數,所以對於類物件引數,不會產生構造和析構。而如果是傳值呼叫,呼叫時會進行構造,退出函式時會進行析構;

3 由於傳引用使用的是原本實參的位址,所以對引用引數值的修改,會在退出函式後體現在主調函式中,而傳值呼叫對引數的修改不會影響到主調函式。

4. 下面**中編譯會報錯的是哪個:

struct cls

cls(int i) {}

void func() {}

};void main(void)

答:雖然實際的錯誤來自c,但是編譯報錯的部分是d。c可以看成是乙個返回值是cls的函式b,所以編譯並不會報錯。

5. 下面**的列印結果:

#include using std::cout;

using std::endl;

class cls

};void main(void)

答:xx 1,xx表示不能確定。

這裡的考察點是成員變數的初始化順序,它依賴於類定義中成員的宣告順序,而不是初始化列表中的順序。因此上例中,i需要先被j初始化,而j的值還是隨機的;然後才是j被初始化為1。

6. 建構函式為什麼不能是virtual的?

答:virtual意味著在執行時期進行繫結,所以在編譯時需確定資訊的不能為virtual。建構函式需在編譯時確定,因為需構造出個物件,才能執行動作。

virtual意味著派生類可以改寫其動作,派生類的建構函式會先執行基類的建構函式而不是取代基類建構函式,也就是說基類的建構函式可以看作派生類建構函式的組成,所以並不能改寫這個函式。

7. 如果類的構造函式呼叫自身,結果會怎麼樣?

答:看下面的例子:

class cls 

private:

int number;

};int main()

編譯的時候會報告警:

1>------ 已啟動生成: 專案: cpptest, 配置: debug win32 ------

1> main.cpp

1>e:\code\c++\cpptest\cpptest\main.cpp(9): warning c4717: 「cls::cls」: 如遞迴所有控制項路徑,函式將導致執行時堆疊溢位

1> cpptest.vcxproj -> e:\code\c++\cpptest\debug\cpptest.exe

********** 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 **********

如果執行的話,就直接異常。

8. 函式func的引數是幾個:

func((a, b), (c, d, e), f);
答:3個。

下面是乙個例子:

#include void func(int x, int y, int z) 

int main(void)

列印的結果如下:

2 5 6
這裡考察的點其實是逗號運算子吧。(a, b)這裡就返回b,(c, d, e)就返回e,因此結果就是2 5 6。

c 筆試題彙總 2

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout str1 str2 cout cout ...

筆試題總結

postmessage只把訊息放入佇列,不管訊息是否處理就返回。而sendmessage被處理完了之後才返回。在很多情況下,基類本身聲場物件是很不合理的。例如 動物作為基類派生出老虎 獅子等子類,但動物本身生成物件明顯不合理。宣告了兩個類 clabase claderiver。父類中宣告虛析構函式。...

筆試題總結

1 引用和指標的區別 相同點 都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址,引用是位址的別名 不同點 1 指標是乙個實體,而引用只是乙個別名 2 引用在初始化時被定義一次,之後不可變,指標可變 3 引用沒有const,而指標由const,const的指標不可變 4 引用不能為空,而...