c 面試問題總結(一)

2021-08-05 22:29:06 字數 2949 閱讀 3594

1.new、delete、malloc、free的關係

malloc/free是c++/c語言的標準庫函式,而new/delete是c++的運算子。

它們都可用於申請動態記憶體和釋放記憶體。

但是,malloc/free是庫函式,不能實現執行建構函式和析構函式,而運算子new/delete可以。

2.c++有哪些性質

封裝、繼承和多型。

3.對於派生類和基類的構造和析構函式的呼叫順序

構造:先基類後派生類

析構:先派生類後基類

4.多型、虛函式、純虛函式、抽象類、虛繼承

c++在執行時的多型是通過虛函式實現的。

虛函式:在基類中冠以virtual關鍵字的函式,允許在派生類中對它重新定義。

純虛函式:在基類中沒有對虛函式給出有意義的實現,把它宣告為純虛函式,它的實現留給派生類去做。

抽象類:有純虛函式的類。抽象類是不能例項化物件的。

虛繼承:解決二義性的問題

!!每乙個有虛函式的類都要有乙個4位元組的指標指向自己的虛函式表,對於虛擬繼承,會增加乙個偏移指標!!

5.求下面函式的返回值(微軟)

int func(x) 

return countx;

}

思路:將x轉化為2進製,看含有的1的個數。

6.「引用」的使用和注意事項

引用和指標的區別

宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。

不能建立陣列的引用。

7.將「引用」作為函式引數有哪些特點?

不用複製,對原物件操作,節省空間。

(1) 傳遞引用給函式和傳遞指標的效果是一樣的,在被呼叫函式中對形參的操作就相當於對其相應的目標物件(主調函式中)的操作。

(2) 使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式。

8.在什麼情況下需要使用「常引用」?

如果既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。

例1

int a ;

const

int &ra=a;

ra=1; //錯誤

a=1; //正確

例2

string foo( );

void bar(string & s);

//那麼下面的表示式將是非法的:

bar(foo( ));

bar("hello world");

原因在於foo( )和」hello world」串都會產生乙個臨時物件,而在c++中,這些臨時物件都是const型別的。因此上面的表示式就是試圖將乙個const型別的物件轉換為非const型別,這是非法的。

引用型引數應該在能被定義為const的情況下,盡量定義為const 。

9.將引用作為函式返回值型別的格式,好處,和注意事項?

格式:型別識別符號 &函式名(形參)

好處:在記憶體中不產生被返回值的副本

注意事項:

(1) 不能返回區域性變數的引用。

(2) 不能返回函式內部new分配的記憶體的引用

(3) 可以返回類成員的引用,但最好是const。

10.struct和union的區別?

struct和union都是由多個不同的資料型別成員組成;

但區別在於:

(1) 任何同一時刻,union中只存放了乙個被選中的成員(所有成員共用一塊位址空間),而struct的所有成員都存在(不同成員的存放位址不同)。

(2) 對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的。

11.重寫和過載的區別

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

不是。兩個不同型別的指標之間可以強制轉換。

c#是型別安全的。

13.main函式執行以前,還會執行什麼**?

全域性物件的建構函式會在main函式之前執行。

全域性物件在main函式之前進行初始化,在main函式返回時撤銷(析構)。

14.描述記憶體分配方式以及它們的區別

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

(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。

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

堆和棧的區別

15.const和#define比有什麼不同(優點)?

(1)const常量有資料型別,而巨集常量沒有資料型別

(2)const在編譯時進行了安全檢查,而巨集常量只是簡單地字元替換。

16.陣列指標和指標陣列

陣列指標:int (*ptr) 指向陣列的指標

指標陣列:int * ptr 或 int *(ptr) 乙個陣列裡面裝著指標

函式指標陣列:int (*s[10]) (int) 每個指標指向乙個int func(int param)的函式

17.基類的析構函式不是虛函式,會帶來什麼問題?

會產生記憶體洩漏。

如果派生類中申請了記憶體空間,並在其析構函式中對這些記憶體空間進行釋放。假設基類中採用的是非虛析構函式,當刪除基類指標指向的派生類物件時就不會觸發動態繫結,因而只會呼叫基類的析構函式,而不會呼叫派生類的析構函式。那麼在這種情況下,派生類中申請的空間就得不到釋放從而產生記憶體洩漏。

面試問題總結(一)

union和union all的區別 union要進行重複值掃瞄,效率比union all要低 union會自動壓縮多個結果集合中的重複結果,而union all則將所有的結果全部顯示出來,不管是不是重複。注意 使用union和union all必須保證各個select 集合的結果有相同個數的列,並...

C 高頻面試問題總結

順序容器 vector,deque是隨機訪問迭代器 list是雙向迭代器 容器介面卡 stack,queue,priority queue沒有迭代器 關聯容器 set,map,multiset,multimap是雙向迭代器 unordered set,unordered map,unordered ...

面試問題總結

學了一年多的語言還沒有真正的搞清楚什麼是面向過程什麼是物件導向,今天整理一下,還希望大家可以提出自己的寶貴意見,謝謝。第一大問題面向過程和物件導向的理解 向過程的概念 面向過程就是分析出我們完成一件事情所需要的步驟,然後用函式把這些步驟一步一步的實現,使用的時候在一步一步的按順序的呼叫。就像是洗臉 ...