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

來源:互聯網
上載者:User
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職場的面試題詳解視頻教程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.