首頁  >  文章  >  後端開發  >  精選的這19道C/C+面試題,你能答對多少呢? - 個人文章 思否

精選的這19道C/C+面試題,你能答對多少呢? - 個人文章 思否

php是最好的语言
php是最好的语言原創
2018-07-26 18:07:031793瀏覽

C和C 的差別?答:c 在c的基礎上增添類,C是一個結構化語言,它的重點在於演算法和資料結構。軟體工程師的面試,套路都差不多,這次約到的問題,下次可能還會遇到。

問1:請用簡單的語言告訴我C 是什麼?

答案:C 是在C語言的基礎上發展的一種物件導向程式語言,應用廣泛。 C 支援多種程式設計範式 ——物件導向程式設計、泛型程式設計和流程化程式設計。其程式設計領域眾廣,常用於系統開發,引擎開發等應用領域,是最受廣大程式設計師受用的最強大程式語言之一,支援類別:類別、封裝、重載等特性!

問2:C和C 的差別?

答案:c 在c的基礎上增添類,C是一個結構化語言,它的重點在於演算法和資料結構。 C程式的設計首要考慮的是如何透過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於C ,首要考慮的是如何建構一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以透過取得物件的狀態資訊來輸出或實現過程(交易)控制。小編推薦一個學C語言/C 的學習裙【 六二七,零一二,四六四 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多乾貨技術資料分享!

問3:什麼是物件導向(OOP)?

答:物件導向是一種對現實世界理解和抽象的方法、思想,透過將需求要素轉化為物件進行問題處理的一種想法。

問4:什麼是多型?

答案:多態是指相同的操作或函數、過程可作用於多種類型的物件上並獲得不同的結果。不同的對象,收到相同訊息可以產生不同的結果,這種現象稱為多態。

問5:設計模式懂嘛,簡單舉例?

答:設計模式(Design pattern)是一套被重複使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。

例如單例模式,保證一個類別只有一個實例,並提供一個存取它的全域存取點。

適用於:當類別只能有一個實例而且客戶可以從一個眾所周知的存取點存取它時;當這個唯一實例應該是透過子類別化可擴展的,並且客戶應該無需更改程式碼就能使用一個擴充的實例時。

例如工廠模式,定義一個用來建立物件的接口,讓子類別決定實例化哪一個類別。 Factory Method 使一個類別的實例化延遲到其子類別。

適用於:當一個類別不知道它所必須創建的物件的類別的時候;當一個類別希望由它的子類別來指定它所建立的物件的時候;當類別將建立物件的職責委託給多個幫助子類別中的某一個,並且你希望將哪一個幫助子類別是代理者這一資訊局部化的時候。

問6:STL函式庫用過嗎?常見的STL容器有哪些?演算法用過哪幾個?

答:STL包括兩部分內容:容器和演算法。 (重要的還有融合這二者的迭代器)

容器,也就是存放資料的地方。比如array等。

在STL中,容器分為兩類:序列式容器和關聯式容器。

序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;

關聯式容器,內部結構基本上是一顆平衡二元樹。所謂關聯,指每個元素都有一個鍵值和一個實值,元素依照一定的規則存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。

下面各選取一個作為說明。

vector:它是一個動態分配儲存空間的容器。區別於c 中的array,array分配的空間是靜態的,分配之後不能被改變,而vector會自動重新分配(擴展)空間。

set:其內部元素會根據元素的鍵值自動被排序。區別於map,它的鍵值就是實值,而map可以同時擁有不同的鍵值和實值。

演算法,如排序,複製…以及個容器特定的演算法。這點不用太多介紹,主要看下面迭代器的內容。

迭代器是STL的精髓,我們這樣描述它:迭代器提供了一種方法,使它能夠按照順序存取某個容器所含的各個元素,但無需暴露該容器的內部結構。它將容器和演算法分開,好讓這二者獨立設計。

問7:資料結構會嗎?專案開發過程中主要用到那些?

答:資料結構中主要會用到數組,鍊錶,樹(少),也會用到堆疊和佇列的想法。

問8:const知道嗎?解釋其作用。

答案:

1.const 修飾類別的成員變量,表示成員常數,不能被修改。

2.const修飾函數承諾在本函數內部不會修改類別內的資料成員,不會呼叫其它非 const 成員函數。

3.如果 const 構成函數重載,const 物件只能呼叫 const 函數,非 const 物件優先呼叫非 const 函數。

4.const 函數只能呼叫 const 函數。非 const 函數可以呼叫 const 函數。

5.類別體外定義的 const 成員函數,在定義和宣告處都需要 const 修飾符。

問9:類別的static變數在什麼時候初始化?函數的static變數在什麼時候初始化?

答案:類別的靜態成員變數在類別實例化之前就已經存在了,並且分配了記憶體。函數的static變數在執行此函數時進行初始化。

問10:堆疊和堆疊的差別?堆積和堆疊的生命週期?

答案:

一、堆疊空間分配區別:

1、堆疊(作業系統):由作業系統自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似資料結構中的堆疊;

2、堆疊(作業系統): 一般由程式設計師指派釋放, 若程式設計師不釋放,程式結束時可能由OS回收,則分配方式倒是類似於鍊錶。

二、堆疊快取方式區別:

1、堆疊使用的是一級緩存,他們通常都是被呼叫時處於儲存空間中,調用完畢立即釋放;

2、堆是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些。

三、堆疊資料結構區別:

堆疊(資料結構):堆疊可以被看成是一棵樹,如:堆疊排序;

堆疊(資料結構):一種先進後出的資料結構。

問11:解釋下封裝、繼承和多型?

答案:

一、封裝:

封裝是實現物件導向程式設計的第一步,封裝就是將資料或函數等集合在一個個的單元中(我們稱之為類)。

封裝的意義在於保護或防止程式碼(資料)被我們無意間破壞。

二、繼承:

繼承主要實作重複使用程式碼,節省開發時間。

子類別可以繼承父類別的一些東西。

三、多態

多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以透過指向基類的指針,來呼叫實作衍生類別中的方法。

問12:指標和引用的差別?

答案:

  1. 指標是一個變量,只不過這個變數儲存的是一個位址,指向記憶體的一個儲存單元;而引用僅是個別名;

  2. 引用使用時無須解引用(*),指標需要解引用;

  3. 引用只能在定義時初始化一次,之後不可變;指標可變;

  4. 引用沒有const,指標有const;

  5. #不能為空,指標可以為空;

  6. 「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;

  7. 指標和引用的自增( )運算意義不一樣;

  8. 指標可以有多級,但是引用只能是一級(int **p;合法而int &&a是不合法的)

9.從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域。

問13:什麼是記憶體洩漏?面對記憶體洩漏和指標越界,你有哪些方法?你通常採用哪些方法來避免和減少這類錯誤?

答案:以動態儲存分配函數動態開啟的空間,在使用完畢後未釋放,結果導致一直佔據該記憶體單元即為記憶體外洩。

使用的時候要記得指標的長度。

malloc的時候得確定在那裡free.

對指標賦值的時候應該注意被賦值指標需要不需要釋放.

動態分配記憶體的指標最好不要再賦值.

問14:常用的排序演算法有哪些?簡單描述幾個排序演算法的優缺點?

答:選擇、冒泡、快速、**、希爾、歸併、堆排等。

1.快排:是冒泡排序的一種改進。

優點:快,資料移動少

缺點:穩定性不足

2.歸併:分治法排序,穩定的排序演算法,一般用於對總體無序,但局部有序的數列。

優點:效率高O(n),穩定

缺點:比較佔用記憶體

問15:new和malloc的差別?

答案:

1、malloc與free是C /C語言的標準函式庫函數,new/delete是C 的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2、對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在創建的同時要自動執行建構函數,物件在消亡之前要自動執行析構函數。

3、由於malloc/free是函式庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行建構子和析構函式的任務強加於malloc/free。因此C 語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以一個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是函式庫函數。

4、C 程式常常要呼叫C函數,而C程式只能用malloc/free管理動態記憶體。

5、new可以認為是malloc加上建構子的執行。 new出來的指標是直接帶型別資訊的。而malloc回傳的都是void指標。

問16:TCP和UDP通訊的差異?什麼是IOCP?

答案:

1.TCP面向連接, UDP面向無連接的

2.TCP有保障的,UDP傳輸無保障的

##3 .TCP是效率低的,UDP效率高的

4.TCP是基於流的,UDP基於數據報文

5.TCP傳輸重要數據,UDP傳輸不重要的數據

IOCP全名為I/O Completion Port,中文譯為I/O完成埠。

IOCP是一個非同步I/O的API,它可以有效率地將I/O事件通知給應用程式。

與使用select()或其它非同步方法不同的是,一個套接字[socket]與一個完成連接埠關聯了起來,然後就可繼續進行正常的Winsock操作了。然而,當一個事件發生的時候,此完成連接埠就會被作業系統加入一個佇列。然後應用程式可以對核心層進行查詢以得到此完成連接埠。

問17:同步IO和非同步IO的差別?

答:

A. 同步

所謂同步,就是在發出功能呼叫時,在沒有得到結果之前,呼叫就不會回傳。

依照這個定義,其實絕大多數函數都是同步呼叫(例如sin isdigit等)。

但是一般而言,我們在說同步、非同步的時候,特別指那些需要其他部件協作或需要一定時間完成的任務。

最常見的例子就是 SendMessage。

該函數發送一個訊息給某個窗口,在對方處理完訊息之前,這個函數不回傳。

當對方處理完畢以後,函數才會把訊息處理函數所傳回的值回傳給呼叫者。

B. 非同步

非同步的概念和同步相對。

當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。

實際處理這個呼叫的元件是在呼叫發出後,透過狀態、通知來通知呼叫者,或透過回呼函數處理這個呼叫。

問18:解釋C 中靜態函數和靜態變數?

答案:

(1)類別靜態資料成員在編譯時創建並初始化:在該類別的任何對象建立之前就存在,不屬於任何對象,而非靜態類別成員變量則是屬於對象所有的。類別靜態資料成員只有一個拷貝,為所有此類的物件所共用。

(2)類靜態成員函數屬於整個類,不屬於某個對象,由該類所有對象共用。

1、static 成員變數實作了同類物件間資訊共享。

2、static 成員類別外存儲,求類別大小,不包含在內。

3、static 成員是命名空間屬於類別的全域變量,儲存在 data 區的rw段。

4、static 成員只能類外初始化。

5、可以透過類別名稱存取(無物件生成時亦可),也可以透過物件存取。

1、靜態成員函數的意義,不在於資訊共享,資料溝通,而在於管理靜態資料成員,完成對靜態資料成員的封裝。

2、靜態成員函數只能存取靜態資料成員。原因:非靜態成員函數,在呼叫時 this指標時被當作參數傳進。而靜態成員函數屬於類,而不屬於對象,沒有 this 指標。

問19:說下你對記憶體的了解?

答案:

1.堆疊- 由編譯器自動分配釋放

2.堆疊- 一般由程式設計師指派釋放,若程式設計師不釋放,程式結束時可能由OS回收

3.全域區(靜態區),全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊區域,未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束釋放

4.另外還有一個專門放常數的地方。 - 程式結束釋放

5 程式碼區,存放2進位代碼。

在函數體中定義的變數通常是在堆疊上,用malloc, calloc, realloc等分配記憶體的函數分配得到的就是在堆上。在所有函數體外定義的是全域量,加了static修飾符後不管在哪裡都存放在全域區(靜態區),在所有函數體外定義的static變數表示在該檔案中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,函數中的"adgfdf"這樣的字串存放在常數區。

相關文章:

分享125個基本的C#面試問答

相關影片:

橫掃PHP職場的面試題詳解影片教學

#

以上是精選的這19道C/C+面試題,你能答對多少呢? - 個人文章 思否的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn