C 經典面試題

2021-08-20 03:26:10 字數 2932 閱讀 2954

最近看一些面試題,覺得如果自己被問到了,並不能很利落的回答出來。

一是從來沒有這個意識,二是沒有認真的梳理下。

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

【參***】

1) 引用必須被初始化,指標不必。

2) 引用初始化以後不能被改變,指標可以改變所指的物件。 

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

可以參考下 在 5 題中補充的內容

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

【參***】

在基類成員函式的宣告前加上virtual關鍵字,意味著將該成員函式宣告為虛函式。

inline與函式的定義體放在一起,使該函式稱為內聯。

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

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

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

哈!我想我確實要注意一下表達能力。。

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

【參***】

debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。

release 稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好地使用。

debug帶有大量的除錯**,執行時需要相應的執行庫,

發布模式程式緊湊不含有除錯**和資訊,直接可以執行(如果不需要執行庫)

14.函式assert的用法?

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

學vc++的時候見過assert巨集定義,但是自己從來沒用過。。。

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

【參***】

(1) const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤(邊際效應) 。 

#define不能生成 類的專屬常量,因為它只是進行簡單的替換。。

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

《effective c++》中建議以const、enum、inline代替#define。

使用enum的原因

有些情況下,編譯器不允許靜態常量出現在類的初始設定中,只得以enum的形式

另一方面,enum和#define更相似,它們都沒有具體的型別,比如,有const int a; 卻沒有 #define n int a,enum和#define都不能夠被去位址,而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 不是庫函式。

以前只是習慣在用c時用malloc/free,用c++時用new/delete,沒注意到這些差異性。

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

【參***】

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

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

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

我一般是直接return 了

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

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

20. const 符號常量;

(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)的定義是一樣的。

1、2和3的區別在於,1和2的const出現在*號左邊,3出現在*號右邊。好像也是在《c和指標》上看到的這句話。

c 經典面試題

1 標頭檔案中的 ifndef define endif 幹什麼用?答 防止該標頭檔案被重複引用。2 include 和 include filename.h 有什麼區別?答 對於 include 編譯器從標準庫路徑開始搜尋 filename.h 對於 include filename.h 編譯器從...

C 經典面試題

1.輸入乙個字串,將其逆序後輸出。使用c 不建議用偽碼 include using namespace std void main a p malloc 1024 應該寫成 p char malloc 1024 沒有釋放p的空間,造成記憶體洩漏。8.下面的 有什麼問題?並請給出正確的寫法。void ...

C 經典面試題

c 知識總結目錄索引 二 哪些函式不能宣告成虛函式 三 為什麼析構函式和建構函式內不能呼叫虛函式 四 為什麼析構函式最好宣告成虛函式 五 實現乙個不能被繼承的類 六 實現乙個類定義出來的物件都在堆上面 七 實現乙個類定義出來的物件都在棧上面 八 實現乙個類,定義出的物件不能在堆上 九 用c語言實現繼...