2023年秋招總結(面經 知識點歸納)

2021-09-12 17:44:52 字數 4487 閱讀 5097

複習的時候總結了一些知識點,主要是c/c++語言基礎,資料結構與演算法,網路與協議,資料庫,linux及作業系統,設計模式,分布式系統這幾個方面。

c++相對於c語言的優點:

物件導向的三大特徵:

繼承extern關鍵字作用:

static關鍵字作用:

static修飾區域性變數

static修飾全域性變數

static 函式

類中的static關鍵字

const的作用:

函式中使用const

類中使用const

volatile:

訪問暫存器要比訪問記憶體要塊,因此cpu會優先訪問該資料在暫存器中的儲存結果,但是記憶體中的資料可能已經發生了改變,而暫存器中還保留著原來的結果。為了避免這種情況的發生將該變數宣告為volatile,告訴cpu每次都從記憶體去讀取資料。

防止編譯器對變數的優化

乙個引數可以即是const又是volatile的嗎? 可以

new與malloc區別:

new分配記憶體按照資料型別進行分配,malloc分配記憶體按照大小分配

new不僅分配一段記憶體,而且會呼叫建構函式,但是malloc則不會。

new的實現原理:先通過malloc申請記憶體空間,然後再呼叫建構函式

new返回的是指定物件的指標,而malloc返回的是void*,因此malloc的返回值一般都需要進行型別轉化;

new是乙個操作符可以過載,malloc是乙個庫函式;

new分配的記憶體要用delete銷毀,malloc要用free來銷毀;delete銷毀的時候會呼叫物件的析構函式,而free則不會;

malloc分配的記憶體不夠的時候,可以用realloc擴容。new沒用這樣操作;realloc擴容的原理:如果當前連續記憶體塊足夠擴容的話就直接擴容,如果當前記憶體塊不夠長就再找乙個足夠長的地方,分配一塊新的記憶體,將原來的內容複製過來,將原來的記憶體空間釋放。

new如果分配失敗了會丟擲bad_malloc的異常,而malloc失敗了會返回null。

new和new的區別,new一次分配所有記憶體,多次呼叫建構函式,分別搭配使用delete和delete,同理,delete多次呼叫析構函式,銷毀陣列中的每個物件。

隱藏

c++多型性與虛函式表:

友元函式:

為什麼對於存在虛函式的類中析構函式要定義成虛函式?

因為將派生類物件繫結到基類指標上,銷毀物件時,如果析構函式沒有定義為虛函式,則會呼叫基類的析構函式,只能銷毀基類部分的資料,若要呼叫派生類的析構函式,則應該將析構函式定義為虛函式,銷毀時通過虛函式表找到對應的析構函式

析構函式能丟擲異常嗎?

不能,如果析構函式丟擲異常,則異常點之後的程式不會執行,如果析構函式在異常點之後執行了某些必要的動作比如釋放某些資源,則這些動作不會執行,會造成諸如資源洩漏的問題。通常異常發生時,c++的機制會呼叫已經構造物件的析構函式來釋放資源,此時若析構函式本身也丟擲異常,則前乙個異常尚未處理,又有新的異常,會造成程式崩潰的問題。

建構函式和析構函式中呼叫虛函式嗎?

不能,建構函式或者析構函式中呼叫虛函式並不會發揮虛函式動態繫結的特性,即使在建構函式或者析構函式中成功呼叫了虛函式,程式的執行結果也是不可控的(在基類中呼叫了派生類的函式)

指標和引用的區別:

智慧型指標:

野指標:未初始化或未清零的指標

形成野指標的原因:

記憶體洩漏:動態開闢的空間,在使用完畢後未釋放,記憶體洩漏是資源洩漏中的一種,資源洩漏的另外一種是控制代碼洩漏

控制代碼洩漏:

舉個例子,socket控制代碼洩漏:b多次嘗試連線a,每一次重連使用乙個socket id ,當c連線b的時候,b沒有了可用的socket id,所以b拒絕服務,解決問題的方法是:在b每次重連a的時候,呼叫系統提供的close()函式,把已經斷開連線的socket的socket id釋放

c++ 11標準**現的新智慧型指標:

shared_ptr物件的引用是強引用

存在的問題

weak_ptr

不具有普通指標的行為,它的作用在於協助shared_ptr工作,被設計為與shared_ptr共同工作

weak_ptr物件的引用是弱引用

weak_ptr觀測資源,但沒有共享資源,不會修改引用計數

use_count():觀測資源的引用計數 

expired():等價於use_count()==0,但更快 

lock():獲取shared_ptr,當expired()==true的時候,lock()函式將返回乙個儲存空指標的shared_ptr 

private protected public區別:

cpp記憶體空間:

堆:由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os**。存放由new,malloc分配的記憶體,可動態擴充套件和收縮

全域性區(靜態區):全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和初始化的靜態變數在一塊區域;未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域

文字常量區:常量字串放在這裡,程式結束後由系統釋放

程式**區:存放函式的二進位制**

堆和棧的區別:

棧由編譯器管理,堆由程式設計師控制

堆會產生碎片,棧不會產生碎片

堆是向上(記憶體增加的方向)生長的,棧是向下生長的

左值和右值:左值既能夠出現在等號左邊也能出現在等號右邊的變數(或表示式),右值指的則是只能出現在等號右邊的變數(或表示式);左值是指表示式結束後依然存在的持久物件,而右值是指表示式結束時就不再存在的臨時物件

explicit:

宣告為explicit的建構函式不能在隱式轉換中使用

隱式轉換

c++四種型別轉換

記憶體對齊的原則

陣列和指標

內聯函式有什麼優點?內聯函式與巨集定義的區別?

巨集定義在預編譯的時候就會進行巨集替換;

內聯函式在編譯階段,在呼叫內聯函式的地方進行替換,減少了函式的呼叫過程,但是使得編譯檔案變大。因此,內聯函式適合簡單函式,對於複雜函式,即使定義了內聯編譯器可能也不會按照內聯的方式進行編譯。

內聯函式相比巨集定義更安全,內聯函式可以檢查引數,而巨集定義只是簡單的文字替換。因此推薦使用內聯函式,而不是巨集定義。

使用巨集定義函式要特別注意給所有單元都加上括號,#define mul(a, b) a b,這很危險,正確寫法:#define mul(a, b) ((a) (b))

c++記憶體管理:

檢查記憶體洩漏:

windows下在debug模式下用crt庫

記憶體分配要通過crt在執行時實現,只要在分配記憶體和釋放記憶體時分別做好記錄,程式結束時對比分配記憶體和釋放記憶體的記錄就可以確定是不是有記憶體洩漏,通過包括 crtdbg.h,將malloc和 free函式對映到它們的除錯版本,即 _malloc_dbg和 _free_dbg,這兩個函式將跟蹤記憶體分配和釋放。 此對映只在除錯版本(在其中定義了_debug)中發生。 發布版本使用普通的 malloc和 free函式。

linux下用valgrind工具    

lambda表示式

匿名函式:[int a](int b){} :a是在函式內可以訪問的外部變數,b是函式引數,可以通過在函式後面用()傳入引數如:(int a);

static a* a;

public​​​:

static a* geta()​

​​}乙個類只有乙個例項(比如windows的任務管理器,無論你開啟多少次,始終顯示乙個視窗)

工廠模式

stl裡的迭代器使用了迭代器模式 

mvc的理解

分布式系統

2020秋招面經總結

本碩均為機電專業相關,比賽和專案也是軟硬體結合,個人軟開背景中學已經學過pascal和資料結構與演算法,大學本科除了c語言和微機原理基本沒學過cs相關課程,研究生才把作業系統 組原以及計算機網路補上,順便補了個c 抽空玩linux,秋招前3個月開始刷題 牛客300,力扣350 第一目標崗位 嵌入式軟...

面經知識點總結(一)

目錄 1 document ready和window.onload的區別 2 form表單當前頁面無重新整理提交 3 settimeout和setinterval的區別 4 重排及重繪,及何時進行重排 批量修改dom 5 偽元素和偽類 前者是dom樹載入完畢就執行,不必等待頁面中或其他外部檔案都載入...

C 2023年秋招面經

以下是樓主的部分面經,按時間記錄的。2020.06.30 招銀網路提前批 面 1 自我介紹 2 專案介紹 4 如何定義乙個常量 5 const和define的區別 6 指標和引用 7 c 的記憶體管理機制 8 new和malloc申請的記憶體是在 在堆上申請的記憶體什麼時候會釋放。9 delete和...