C 面試題目集合(持續跟新)

2021-05-28 12:38:16 字數 4579 閱讀 2820

與我前面寫的c語言高階知識點遙相呼應。

這才是c++面試,網上的面試題有些太簡單了。

c++面試題目最多集中在物件的記憶體模型,記住了:如果用c/c++,記憶體都不清楚,還寫個屁的程式!

1.c++的虛函式是怎樣實現的?

c++的虛函式使用了乙個虛函式表來存放了每乙個虛函式的入口位址,這個虛函式表又使用乙個虛函式指標來進行訪問。通常,虛函式指標都放在物件模型的第乙個位置存放,這樣訪問徐函式指標的速度最快,沒有偏移量。通過虛函式指標,找到虛函式表,進而再做乙個次偏移量計算,來得到真實虛函式的入口位址,從而訪問了虛函式。這樣看來,訪問乙個虛函式將使用兩次間接計算,故要失去一些時間效率。另外,使用了虛函式,那麼就要消耗一些空間,存放虛函式指標。但是,這都是值得的,為了實現多型。

2.

虛函式表是每個物件乙個還是每個類乙個呢?

這個事搜狗的面試題目。其實討論過,我之前看到這個問題,立馬就想到了this指標。比較詳細的討論。

每個類只有若干個虛函式表,每個物件可以有若干個虛函式表指標。(這都是在多重繼承的情況下出現的。單重繼承的情況下,就是乙個物件有乙個虛函式表指標,每乙個類有乙個虛函式表)函式呼叫的時候會將this指標作為引數發過去,所以沒有必要為每乙個物件做乙個虛函式表。

「每個類有乙個或多個虛函式表,單純的繼承下來的類有乙個虛函式表,虛繼承下來的類就有可能有多個虛函式表(只是有可能),物件沒有虛函式表,但是有指向虛函式表的指標。物件之所一能呼叫「自己的函式」,是因為類的成員函式不知不覺的在編譯時多了乙個this指標引數來識別成員資料屬於哪個物件。」

關於這個問題,在《more effective c++》中的條款24有詳細敘述,的確是每乙個類的乙個虛函式表。至於放的的位置,書中也有講述。

3.函式指標和指標函式的區別?

就想通過這個問題來判斷我的c水平?c語言我看的數都有三本。

函式指標,乙個指標,指向了函式的呼叫位址。  void (*fun)(void)

指標函式,就是乙個函式的返回值是指標。 int *  fun(void)

這道題目我真的很冤,指標函式,我真的沒有聽說過。

陣列指標和指標陣列我知道什麼區別

4. c++ 深拷貝和淺拷貝的區別?如果要delete乙個淺拷貝,需要注意什麼條件?

現在有乙個指標p1指向了乙個記憶體空間m1;

淺拷貝就是再用乙個新的指標p2指向這片記憶體空間m1;

深拷貝就是用乙個新的指標p3指向m1的副本m2

delete乙個淺拷貝,首先要測試是不是有其它的指標還在指向這片空間。不然,直接就是野指標了。為什麼野指標那麼是絕對要禁止的?野指標現在指向了一片記憶體區間,這片記憶體區間以前是有意義的,現在被釋放了,作業系統可能會講這邊區間放上其它程式資料。那麼,野指標仍然指向了這片區間。如果此時使用野指標,改變了這片記憶體的資料,那麼程式應該直接崩潰。而且,這樣子的崩潰可能出現,可能等一會兒出現,不定。帶來的bug很難查詢。

5.  dynamic_cast的用法?

作為四個內部型別轉換操作符之一的dynamic_cast和傳統的c風格的強制型別轉換有著巨大的差別。除了dynamic_cast以外的轉換,其行為的都是在編譯期就得以確定的,轉換是否成功,並不依賴被轉換的物件。而dynamic_cast則不然。在這裡,不再討論其他三種轉換和c風格的轉換。

首先,dynamic_cast依賴於rtti資訊,其次,在轉換時,dynamic_cast會檢查轉換的source物件是否真的可以轉換成target型別,這種檢查不是語法上的,而是真實情況的檢查。

先看rtti相關部分,通常,許多編譯器都是通過vtable找到物件的rtti資訊的,這也就意味著,如果基類沒有虛方法,也就無法判斷乙個基類指標變數所指物件的真實型別, 這時候,dynamic_cast只能用來做安全的轉換,例如從派生類指標轉換成基類指標.而這種轉換其實並不需要dynamic_cast參與.

也就是說,dynamic_cast是根據rtti記載的資訊來判斷型別轉換是否合法的。

struct b1

};struct b2

};struct d1 : b1, b2{};

int main()

pb2將會為null指標,pb22將會編譯出錯。

dynamic_cast < type-id > ( expression )  

該運算子把expression轉換成type-id型別的物件。type-id必須是類的指標、類的引用或者void*;  

如果type-id是類指標型別,那麼expression也必須是乙個指標,如果type-id是乙個引用,那麼expression也必須是乙個引用。  dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。  

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;  

在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

dynamic_cast 確實很好地解決了我們的問題,但也需要我們付出代價,那就是與 typeid 相比,dynamic_cast 不是乙個常量時間的操作。為了確定是否能完成強制型別轉換,dynamic_cast`必須在執行時進行一些轉換細節操作。因此在使用 dynamic_cast 操作時,應該權衡對效能的影響

class   wheel{};

class color{};

class car

~car()

};class roadster : public car

; roadster(const roadster& rs)

~roadster(){};

roadster& operator=(const roadster& rhs)

const roadster& clone()

};int main(int argc, char* argv);

修改如下:

class   wheel{};

class color{};

class car

~car()

//3. 析構函式要虛擬

//4. delete wheels; -> delete wheels;

//5. 要提供拷貝建構函式

//6. 要過載賦值操作符

};class roadster : public car

; //8. 要呼叫父類的建構函式

roadster(const roadster& rs)

//9. 要呼叫父類的拷貝建構函式

~roadster(){};

//10. 析構函式要虛擬(原則:析構函式要麼虛擬且公有,要麼保護且非虛擬)

roadster& operator=(const roadster& rhs)

//11. 需要呼叫父類的賦值操作符

//12. 沒有返回值

//13. 返回的型別最好是const roadster&, 而不是roadster&

const roadster& clone()

//14. 不能返回區域性變數的引用

//15. 按照這裡的邏輯, 其實可以直接返回*this

};int main(int argc, char* argv)風格與前面的不一致

roadster* yours = new roadster;

roadster mine; mine = yours-> clone();

//17. 最好是一行只有一條語句, 不要兩條語句放在一行

//18. 其實這裡可以直接是roadster mine = yours-> clone();

car* pcar = yours;

delete pcar;

//我認為這裡是沒有問題的,作為car類的使用者,他在這裡用是沒有問題的,錯誤的只是car類的**

return 0;

};

6.c++程式進入main函式之前,退出main函式之後會做些什麼?

main函式執行之前,主要就是初始化系統相關資源:

1.設定棧指標

2.初始化static靜態和global全域性變數,即data段的內容

3.將未初始化部分的賦初值:數值型short,int,long等為0,bool為false,指標為null,等等,即.bss段的內容

4.執行全域性構造器,c++中建構函式

5.將main函式的引數,argc,argv等傳遞給main函式,然後才真正執行main函式

main 函式之後會執行相反的工作。

C 面試題,持續跟新中

先算x x x,得x 5 5 5,x 20 再算x x 得出x 40指標陣列和陣列指標的區別 int p 4 和int p 4 的區別 int p 4 定義乙個指標陣列,該陣列中每個元素是乙個指標,每個指標指向 就需要程式中後續再定義了。int p 4 定義乙個陣列指標,該指標指向含4個元素的一維陣...

C 面試題目

1 ispostback正確的是 首次載入頁面的ispostback的值為false 重新整理頁面後的ispostback的值為true 第三個選項忘了 2 頁面傳值的幾種方式 request.querystring session server.transfer 3 什麼是瀏覽器的 無狀態 如何解...

c 面試題目

摘要 12個c語言面試題,涉及指標 程序 運算 結構體 函式 記憶體,看看你能做出幾個!1.gets 函式 問 請找出下面 裡的問題 include int main void 答 上面 裡的問題在於函式 gets 的使用,這個函式從 stdin 接收乙個字串而不檢查它所複製的快取的容積,這可能會導...