面試寶典 類和資料抽象 物件導向程式設計與泛型程式設計

2021-09-26 16:00:57 字數 3034 閱讀 2356

1、c++中類成員的訪問許可權:

c++通過public、protected、private三個關鍵字來控制成員變數和成員函式的訪問許可權,分別表示共有、受保護、私有,在類的內部三種型別都可以相互訪問,在類外部,只能通過物件訪問成員,(靜態的可以用類名訪問)並通過物件只能訪問public屬性的成員,不能訪問private、protected屬性的成員。

2、c++中struct和class的區別:

在c++中可以用struct和class定義類,都可以繼承,區別是:struct的預設繼承許可權和預設訪問許可權是public,而class的預設繼承許可權和預設訪問許可權都是private。另外class還可以定義模板類形參。

3、c++類內可以定義引用資料成員嗎?

可以,必須通過成員函式初始化列表初始化。

4、什麼是右值引用,跟左值引用又有什麼區別?

右值引用是c++11中引入的新特徵,實現了轉移語義和精確傳遞,主要目的是:消除兩個物件互動時不必要的物件拷貝;能夠更簡潔明確的定義泛型函式。

區別:左值可以定址右值不可以;

左值可以被賦值,右值不可以被賦值,可以用來給左值賦值;

左值可變,右值不可變。

5、乙個c++原始檔從文字到可執行檔案經歷的過程:

預處理階段:將文字中的標頭檔案和巨集定義進行分析和替換,生成預編譯檔案;

編譯階段:將預處理階段生成的預編譯檔案轉換成彙編檔案;

彙編階段:將編譯階段生成的彙編檔案轉化成目標檔案;

鏈結階段:將多個目標檔案以及其所需要的庫連線成可執行檔案。

6、include標頭檔案的順序,以及雙引號和尖括號的區別:

如果在a.h中宣告了乙個在b.h中的變數,而不引用b.h,在a.c中引用b.**件,要先引用b.h後引用a.h;

雙括號和尖括號的標頭檔案查詢路徑不同:

雙引號:當前檔案,編譯器設定的標頭檔案,系統變數設定的標頭檔案;

雙尖括號:編譯器定義的標頭檔案路徑,系統變數設定的標頭檔案路徑。

7、malloc的原理,brk、mmap系統呼叫的作用分別是:

malloc用於動態分配記憶體空間,為了減少空間碎片和系統呼叫的開銷,malloc採用記憶體池的方法,先申請一大塊記憶體最為堆,再將堆分割成多個塊,以塊作為記憶體分配和管理的基本單位,使用隱式鍊錶將堆區分成多個連續的,大小不同的塊,使用顯示鍊錶管理未分配塊;

當記憶體分配時先遍歷隱式鍊錶的所有空閒塊,選擇合適的塊進行分配,當記憶體合併時看當前塊的前後塊是否空閒;

當申請的記憶體大於128k時,使用mmap系統呼叫在對映區分配,當申請記憶體小於128k時,使用brk系統呼叫在堆區分配。

8、c++記憶體管理是怎麼樣的:

程式段:分為文字區和唯讀儲存區,靜態字串常量儲存在唯讀儲存區,文字區儲存機器**;

資料段:儲存已初始化的靜態變數和全域性變數;

bss段:儲存未初始化的靜態變數和全域性變數;以及所有被初始化為0的靜態變數和全域性變數;

堆區:呼叫malloc/new時在堆區分配記憶體,需要free/delete手動釋放;

檔案對映區:儲存動態鏈結庫,以及呼叫mmap函式進行的檔案對映;

棧區:儲存返回位址,引數,返回值,區域性變數等;

9、如何判斷記憶體洩漏:

使用linux的valgrind工具,在寫程式時新增統計分配記憶體和釋放記憶體的功能,判斷申請和釋放記憶體是否一致來判斷是否記憶體洩漏。

11、什麼是記憶體洩漏:

記憶體洩漏不是記憶體丟失,是由於錯誤疏忽未能釋放不再使用的記憶體;分為堆記憶體洩漏,系統記憶體洩露,沒有將基類的析構函式定義為虛函式。

12、malloc和new的區別:

new按照物件型別分配空間,malloc按照大小分配記憶體空間;

new返回物件的指標,malloc返回空指標需要強制轉換;

new使用delete釋放,malloc使用free釋放,delete銷毀時會呼叫析構函式free不會;

new分配記憶體不夠時會丟擲bad_malloc錯誤,malloc返回null;

malloc可以使用realloc重新分配記憶體,new不可以;

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

new會呼叫建構函式,malloc不會;

13、共享記憶體相關的api:

shmget建立新的共享記憶體;

shmat共享記憶體連線到程序的位址空間;

shmdt共享記憶體和程序位址空間分離;

shmctl控制共享記憶體;

14、單執行緒如何處理高併發:

利用i/o復用;然後採用事件驅動模型,基於非同步互調來處理事件。

15、c++stl記憶體優化:

二級配置其結構;

二級記憶體池;

16、說說select,epoll的區別,原理,效能,限制方面:

不按牛客上的來,他的理解不動,按這個:

select在呼叫前會將要監控的描述符的bit位置1,然後將其傳給select,當有事件發生時,select會返回所有的描述符,由應用程式自己去查詢哪個描述符有事件發生,效率很低,呼叫前會由使用者態轉到核心態,呼叫後會由核心態轉為使用者態,開銷很大,內建陣列的形式使得檔案描述符的最大檔案數受限;

epoll是poll的改進版本,首先會建立epoll物件,然後使用epoll_ctl將要監控的描述符傳進去,使用epoll_event結構體的形式組成一顆紅黑樹,接著阻塞在epoll_wait,進入大迴圈,當有事件發生時,返回相對應的結構體放入乙個鍊錶中,返回有事件發生的鍊錶;採用了可變長陣列,使得檔案最大數不再受限,只返回對應的鍊錶效率會提高;

17、c++11有哪些新特徵:

auto關鍵字:編譯器可以自動根據初始值推導出型別,不能用於函式傳參以及陣列型別的推導;

nullptr關鍵字:可以轉換為任意型別的指標,null一般被定義為0;

智慧型指標,初始化列表初始化,右值引用,新增了兩個stl容器。

18、介紹一下c++11中的可變引數模板,右值引用和lambda函式這幾個新特徵:

可變引數模板對函式引數進行了高度的泛化,可以表示任意個數,任意型別的引數,語法為在class或者typename後面帶上省略號…;

右值引用作用是轉移語義和精確傳值,它消除了兩個物件互動時不必要的物件拷貝,能夠更加方便的定義泛型函式;

lambda表示式定義了乙個匿名函式,可以捕獲一定範圍內的變數。

牛客 面試寶典 第2章 第5節 類和資料抽象

目錄 一 目的 2 面試寶典中,關於c 部分的,準備總結,方便下次csdn中直接檢視 二 參考 1 牛客網 第2章 第5節 類和資料抽象 三 內容 操作 1 請你來說一下c 中類成員的訪問許可權 20200801 2 請你來說一下c 中struct和class的區別 20200801 3 請你回答一...

物件導向 抽象類

抽象 裡邊有未明確的東西。抽象類的特點 1 抽象方法一定在抽象類中。2 抽象方法和抽象類都必須被abstract關鍵字修飾。3 抽象類不可以用new建立物件,因為呼叫抽象方法沒意義。4 抽象類中的抽象方法要被使用,必須由子類複寫其所有的抽象方法後,建立子類物件呼叫。如果子類只覆蓋部分抽象方法,那麼該...

物件導向 抽象類

抽象類概述 什麼是抽象類?什麼是抽象方法?抽象方法 沒有方法體的方法就是抽象方法,必須用abstract關鍵字去修飾。抽象類 擁有抽象方法的類,就是抽象類。應用場景 在不同的子類往上抽取方法時,方法的定義是一樣的,但是方法體不一樣,所以抽取到父類時就可以使用抽象方法。簡單來說 當多個子類擁有同乙個功...