c和c面試題

2021-03-04 05:40:28 字數 4924 閱讀 6059

1.c和c++中struct 有什麼區別

答:c沒有protection行為,不可以定義函式,但可以有函式指標

c++有protection行為,預設是public;可以定義函式。

2.c++中的struct和class有什麼區別

答:從語法上講,class和struct做型別定義時只有兩點區別:

1> 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理

2> 成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。

除了這兩點,class和struct基本就是乙個東西。語法上沒有任何其它區別。

3.如何判斷一段程式是由c編譯程式還是由c++編譯程式編譯的

答:有乙個巨集可以用來判斷

#ifdef __cplusplus

cout << 「c++」;

#else

cout << 「c」;

#endif

4.c和c++有什麼不同

答:從機制上:c是面向過程的(但c也可以編寫物件導向的程式);c++是物件導向的,提供了類。但是,c++編寫物件導向的程式比c容易。

從適用的方向:c適合要求**體積小的,效率高的場合,如嵌入式,c++適合更上層的,複雜的;linux核心大部分是c寫的,因為它是系統軟體,效率要求極高。

從名稱上也可以看出,c++比c多了+,說明c++是c的超集,那為什麼不叫c+ 而叫c++呢,是因為c++比c來說擴充的東西太多了,所以就在c後面放上兩個+,於是就成了c++

c語言是結構化程式設計語言,c++是物件導向程式設計語言

c++側重於物件而不是過程,側重於類的設計而不是邏輯的設計。

5.「引用」與指標的區別是什麼?

答:指標通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。程式中使用指標,程式的可讀性差,而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作。

6.class a

classb: class a {void func1(){cout << 「fun1 in class b」

id [sizeof(unsigned long)]; 這個對嗎?為什麼?

答:正確;這個sizeof是編譯時運算子,編譯時就確定了,可以看成和機器有關的常量。

8.某檔案中定義的靜態全域性變數(或稱靜態外部變數)其作用域是()?

答:本檔案。靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。

由於靜態全域性變數作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

9.c++函式中值的傳遞方式有哪幾種?

答:c++函式的三種傳遞方式為:值傳遞、指標傳遞和引用傳遞。

10.對於乙個頻繁使用的短小函式,在c語言中應用什麼實現,在c++中應用什麼實現

答:c用巨集定義,c++用inline

11.引用與指標有什麼區別

答:1>引用必須被初始化,指標不必

2>引用初始化以後不能被改變(c++ 11可以改變),指標可以改變所指的物件

3>不存在指向空值的引用,但是存在指向空值的指標。

12.c++中virtual與inline的含義分別是什麼?

答:在基類成員函式的宣告前加上virtual關鍵字,意味著將該成員函式宣告為虛函式。inline與函式的定義體放在一起,使該函式稱為內聯。

inline是一種用於實現的關鍵字,而不是用於宣告的關鍵字。

虛函式的特點,如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義為虛方法,這樣可以啟用動態聯編。

內聯函式的特點,使用內聯函式的目的是為了提高函式的執行效率。內聯函式體的**不能過長,因為內聯函式省去呼叫函式的時間是以**膨脹為代介的。內聯函式不能包含迴圈語句,因為執行迴圈語句要比呼叫函式的開銷大。

13.vc中,編譯工具條內的debug與release選項是什麼含義?

答:debug通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。release稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好地使用。

debug帶有大量的除錯**,執行時需要相應的執行庫,發布模式程式緊湊不含有除錯**和資訊,直接可以執行(如果不需要執行庫)

14.函式assert的用法?

答:斷言assert是僅在debug版本起作用的巨集,用於檢查「不應該」發生的情況。程式設計師可以把assert看成乙個在任何系統狀態下都可以安全使用的無害測試手段。

與#define 的比較,const有什麼優點?

答:1>const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。

而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤(邊際效應)。

2>有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。

16.請你談談引用和指標的區別

1>引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)

2>不能有null引用,左值引用必須與合法的儲存單元關聯(指標則可以是null)記憶體,右值引用引用暫存器。

3>一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。

17.有了malloc/free為什麼還要new/delete?

答:malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

對於非內部資料型別的物件而言,光用malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。

18.如果在申請動態記憶體時找不到足夠大的記憶體塊,malloc和new將返回null指標,宣告記憶體申請失敗。你是怎麼處理記憶體耗盡的?

答:1>判斷指標是否為null,如果是則馬上用return語句終止本函式。

2>判斷指標是否為null,如果是則馬上用exit(1)終止整個程式的執行

3>為new和malloc設定異常處理函式。例如visual c++可以用_set_new_hander函式為new設定使用者自定義的異常處理函式,也可以讓malloc享用與new相同的異常處理函式。

19.c++是不是型別安全的?

答:不是。兩個不同型別的指標之間可以強制轉換(用reinterpret cast)。

符號常量

1>const char *p

2>char const *p

3>char * const p

說明上面三種描述的區別:

1)p是乙個指向const char的指標,p是可以改變指向的,但是p指向的值是不能改變的

2)p指向的恰好是乙個指向const的char的普通指標

3)p是乙個指標,這個指標是指向 char 的const指標

1和2的定義是一樣的。

21.用c++寫個程式,如何判斷乙個作業系統是16位還是32位的?

答:定義乙個指標p,列印出sizeof(p),如果結果是4,則表示該作業系統是32位,列印結果是2,表示是16位。

22.用c++寫個程式,如何判斷乙個作業系統是16位還是32位的?不能用sizeof()函式。

答:int a=~0;

if(a>65536){ cout << 「32 bit」 <如果是判斷32位和64位,需要用到sizeof()。

23.voidfp1)(int))[10];

float (* (* fp2)(int,int,int))(int);

int (* ( * fp3)())[10]();

分別表示什麼意思?

1>void *( *(* fp1)(int))[10];

fp1 是乙個指標,指向乙個函式,這個函式的引數為int型,函式的返回值是乙個指標,這個指標指向乙個陣列,這個陣列有10個元素,每乙個元素是乙個void*型指標。

2>float ( * ( * fp2)(int,int,int))(int);

fp2是乙個指標,指向乙個函式,這個函式的引數為3個int型,函式的返回值是乙個指標,這個指標指向乙個函式,這個函式的引數為int型,函式的返回值是float型。

3>int (* ( * fp3)())[10]();

fp3是乙個指標,指向乙個函式,這個函式的引數為空,函式的返回值是乙個指標,這個指標指向乙個陣列,這個陣列有10個元素,每個元素是乙個指標,指向乙個函式,這個函式的引數為空,函式的返回值是int型。

24.多型類中的虛函式表是***pilie-time,還是run-time時建立的?

虛函式表是在編譯期就建立了,各個虛函式這時被組織成了乙個虛函式的入口位址的陣列,而物件的隱藏成員—虛函式表指標是在執行期—也就是建構函式被呼叫時進行初始化的,這是實現多型的關鍵。

25.錯誤的轉義字元是: a.』\091』 b.』\\』 c.』\0』 d.』\』 『

答:a ,因為0開頭的是二進位制

26.若陣列名作實參而指標變數作形參,函式呼叫實參傳給形參的是

答:陣列第乙個元素的位址

27.記憶體的分配方式有幾種?

答:1>從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數

2>在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

3>從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

C和C面試題目

c c 筆試 面試題目大彙總 1.求下面函式的返回值 微軟 intfunc x returncountx 假定x 9999。答案 8 思路 將x轉化為2進製,看含有的1的個數。2.什麼是 引用 申明和使用 引用 要注意哪些問題?答 引用就是某個目標變數的 別名 alias 對應用的操作與對變數直接操...

C 經典面試題

本試題僅用於考查c c程式設計師的基本程式設計技能。內容限於c c常用語法,不涉及資料結構 演算法以及深奧的語法。考試成績能反映出考生的程式設計質量以及對c c的理解程度,但不能反映考生的智力和軟體開發能力。筆試時間90分鐘。請考生認真答題,切勿輕視。一 請填寫bool float,指標變數與 零值...

C 面試題彙總

c 筆試題彙總 鍊錶反轉 單向鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的 1 2 3 4 5 通過反轉後成為5 4 3 2 1。最容易想到的方法遍歷一遍鍊錶,利用乙個輔助指標,儲存遍歷過程中當前指標指向的下乙個元素,然後將當前節點元素的指標反轉後,利用已經儲...