C++面試集錦( 面試被問到的問題 )

1. C 和 C++ 區別css

    

2. const 有什麼用途html

    主要有三點:linux

      1:定義只讀變量,即常量 c++

      2:修飾函數的參數和函數的返回值 git

      3: 修飾函數的定義體,這裏的函數爲類的成員函數,被const修飾的成員函數表明不修改爲員變量的值
程序員

 

3. 指針和引用的區別面試

    1:引用是變量的一個別名,內部實現是隻讀指針算法

    2:引用只能在初始化時被賦值,其餘時候值不能被改變,指針的值能夠在任什麼時候候被改變shell

    3:引用不能爲NULL,指針能夠爲NULL編程

    4:引用變量內存單元保存的是被引用變量的地址

    5:「sizeof 引用" = 指向變量的大小 , "sizeof 指針"= 指針自己的大小

    6:引用能夠取地址操做,返回的是被引用變量自己所在的內存單元地址

    7:引用使用在源代碼級至關於普通的變量同樣使用,作函數參數時,內部傳遞的實際是變量地址

 

4. C++中有了malloc / free , 爲何還須要 new / delete     

  1,malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。
  2,對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。
     對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。
     因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。
  3,所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。

 

 

5. 編寫類String 的構造函數,析構函數,拷貝構造函數和賦值函數

 

6. 多態的實現

7. 單鏈表的逆置

 

8. 堆和棧的區別   

  一個由c/C++編譯的程序佔用的內存分爲如下幾個部分 
  一、棧區(stack)―   由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。 
  二、堆區(heap) ―   通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
     注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表,呵呵。 
  三、全局區(靜態區)(static)―,全局變量和靜態變量的存儲是放在一塊的,
     初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。 - 程序結束後有系統釋放 
  四、文字常量區  ―常量字符串就是放在這裏的。 程序結束後由系統釋放 
  五、程序代碼區―存放函數體的二進制代碼。

 

 

10. 不調用C/C++ 的字符串庫函數,編寫strcpy

   char * strcpy(char * strDest,const char * strSrc)
        {
                if ((strDest==NULL)||strSrc==NULL))                     
                   return NULL;    
                char * strDestCopy=strDest; 
                while ((*strDest++=*strSrc++)!='\0'); 
                *strDest = '\0';
                return strDestCopy;
        }

 

 

11. 關鍵字static的做用

    1.  函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量, 該變量的內存只被分配一次,所以其值在下次調用時仍維持上次的值

    2.  在模塊內的 static 全局變量能夠被模塊內全部函數訪問,但不能被模塊外其餘函數訪問

    3.  在模塊內的static 函數只可被這一模塊內的其餘函數調用,這個函數的使用範圍被限制在聲明它的模塊內

    4.  在類的static 成員變量屬於整個類所擁有,對類的因此對象只有一份拷貝

    5.  在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的 static 成員變量

   

     介紹它最重要的一條:隱藏。(static函數,static變量都可) --> 對應上面的二、3項
        當同時編譯多個文件時,全部未加static前綴的全局變量和函數都具備全局可見性。
        舉例來講明。同時編譯兩個源文件,一個是a.c,另外一個是main.c。

   //a.c
    char a = 'A';               // global variable
    void msg()
    {
      printf("Hello\n");
    }
  //main.c
   int main()
   {
     extern char a;       // extern variable must be declared before use
     printf("%c ", a);
     (void)msg();
     return 0;
   }

       程序的運行結果是:

     A Hello

 

 

      爲何在a.c中定義的全局變量a和函數msg能在main.c中使用?

      前面說過,全部未加static前綴的全局變量和函數都具備全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,而且都沒有加static前綴,

        所以對於另外的源文件main.c是可見的。

     若是加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。

     利用這一特性能夠在不一樣的文件中定義同名函數和同名變量,而沒必要擔憂命名衝突。static能夠用做函數和變量的前綴,對於函數來說,static的做用僅限於隱藏

 

12. 在c++程序中調用被C編譯器編譯後的函數,爲何要加extern「C」

     C++語言支持函數重載,C語言不支持函數重載,函數被C++編譯器編譯後在庫中的名字與C語言的不一樣,

      假設某個函數原型爲:

  1.           void foo(int x, inty);
    該函數被C編譯器編譯後在庫中的名字爲:  _foo
    而C++編譯器則會產生像: _foo_int_int   之類的名字。
    爲了解決此類名字匹配的問題,C++提供了C連接交換指定符號 extern "C"。

 

 

13. 頭文件種的ifndef/define/endif 是幹什麼用的

      防止頭文件被重複包含

 

14. 線程和進程的聯繫和區別

      http://blog.csdn.NET/wolenski/article/details/7969908

 

15. 線程有哪幾種狀態

     http://blog.csdn.Net/wolenski/article/details/7969908

 

16. 進程間的通訊方式

     管道、有名管道、信號、共享內存、消息隊列、信號量、套接字、文件.

 

17. 線程同步和線程互斥的區別

    http://blog.csdn.net/wolenski/article/details/7969908

 

18. 線程同步的方式

     Linux:   互斥鎖、條件變量和信號量

     http://blog.csdn.net/zsf8701/article/details/7844316

 

19. 網絡七層

    

20. TCP和UDP有什麼區別

     TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。

                 當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。

                 TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。

     UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。

                 UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。

                 因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快

 

21. 編寫socket套接字的步驟

 

22. TCP三次握手和四次揮手, 以及各個狀態的做用

     http://hi.baidu.com/suxinpingtao51/item/be5f71b3a907dbef4ec7fd0e?qq-pf-to=pcqq.c2c

 

23. HTTP協議

            http(超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的鏈接方式,

     HTTP1.1版本中給出一種持續鏈接的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。

    TCP 和 HTTP區別: http://blog.csdn.net/lemonxuexue/article/details/4485877

 

24. 使用過的 shell 命令

       cp , mv , rm , mkdir , touch , pwd , cd  , ls , top , cat , tail , less , df , du , man , find , kill , sudo , cat 

 

25. 使用過的 vim 命令

       wq!, dd , dw , yy , p , i , %s/old/new/g , /abc 向後搜索字符串abc , ?abc向前搜索字符串abc

 

26. 使用過的 gdb 命令

      http://blog.csdn.net/dadalan/article/details/3758025

 

27. 常見算法

       快速排序、堆排序和歸併排序

       堆排序 : http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621

       快速排序、歸併排序: http://blog.csdn.net/morewindows/article/details/6684558

       穩定性分析 http://baike.baidu.com/link?url=ueoZ3sNIOvMNPrdCKbd8mhfebC85B4nRc-7hPEJWi-hFo5ROyWH2Pxs9RtvLFRJL

 

28. C庫函數實現

 

29. 靜態鏈表和動態鏈表的區別

      http://blog.csdn.net/toonny1985/article/details/4868786

 

31. 大併發( epoll )

       優勢:

             http://blog.csdn.net/sunyurun/article/details/8194979

       實例:

             http://www.cnblogs.com/ggjucheng/archive/2012/01/17/2324974.html

       

32. 海量數據處理的知識點,(hash表, hash統計)

    hash表: http://hi.baidu.com/05104106/item/62736054402852c09e26679b

    海量數據處理方法: http://blog.csdn.net/v_july_v/article/details/7382693

 

 

33. 何時要用虛析構函數

       經過基類的指針來刪除派生類的對象時,基類的析構函數應該是虛的。不然其刪除效果將沒法實現。

       通常狀況下,這樣的刪除只可以刪除基類對象,而不能刪除子類對象,造成了刪除一半形象,從而千萬內存泄漏。

      緣由:

              在公有繼承中,基類對派生類及其對象的操做,只能影響到那些從基類繼承下來的成員。

              若是想要用基類對非繼承成員進行操做,則要把基類的這個操做(函數)定義爲虛函數。
              那麼,析構函數天然也應該如此:若是它想析構子類中的從新定義或新的成員及對象,固然也應該聲明爲虛的。

      注意:

      若是不須要基類對派生類及對象進行操做,則不能定義虛函數(包括虛析構函數),由於這樣會增長內存開銷。

 

34. c++怎樣讓返回對象的函數不調用拷貝構造函數

    拷貝構造函數前加 「explicit」 關鍵字

35. 孤兒進程和殭屍進程

   http://www.cnblogs.com/Anker/p/3271773.html

 

各大計算機公司 筆試及面試 題目

http://blog.csdn.net/huyfaeng/article/category/880022

 

面試題有難有易,不能由於容易,咱們就輕視,更不能由於難,咱們就放棄。咱們面對高薪就業的態度永遠不變,那就是堅持、堅持、再堅持。出現問題,找緣由;遇到困難,想辦法。咱們一直堅信只有在堅持中才能看到但願,而不是看到但願纔去堅持。

人生沒有若是,只有結果和後果。既然選擇了,就不後悔。年輕就是資本,年輕就要吃苦,就要歷練。就要學會在堅持中成長。如此感慨,至深的心得體會,絕對的經驗之談。

OK,進入正題,下面就是《必須掌握的20道技術面試題》。

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

答:C++是在C語言的基礎上開發的一種面向對象編程語言,應用普遍。C++支持多種編程範式 --面向對象編程、泛型編程和過程化編程。 其編程領域衆廣,經常使用於系統開發,引擎開發等應用領域,是最受廣大程序員受用的最強大編程語言之一,支持類:類、封裝、重載等特性!

問2: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、堆棧空間分配區別:

一、棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧;

二、堆(操做系統): 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式卻是相似於鏈表。

2、堆棧緩存方式區別:

一、棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放;

二、堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。

3、堆棧數據結構區別:

堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;

棧(數據結構):一種先進後出的數據結構。

問11:C和C++的區別?

答:C++在C的基礎上增添類

C是一個結構化語言,它的重點在於算法和數據結構。

C程序的設計首要考慮的是如何經過一個過程,對輸入(或環境條件)進行運算處理獲得輸出(或實現過程(事務)控制),而對於C++,首要考慮的是如何構造一個對象模型,讓這個模型可以契合與之對應的問題域,這樣就能夠經過獲取對象的狀態信息獲得輸出或實現過程(事務)控制。

 

問12:解釋下封裝、繼承和多態?

答:

1、封裝:

封裝是實現面向對象程序設計的第一步,封裝就是將數據或函數等集合在一個個的單元中(咱們稱之爲類)。

封裝的意義在於保護或者防止代碼(數據)被咱們無心中破壞。

2、繼承:

繼承主要實現重用代碼,節省開發時間。

子類能夠繼承父類的一些東西。

3、多態

多態:同一操做做用於不一樣的對象,能夠有不一樣的解釋,產生不一樣的執行結果。在運行時,能夠經過指向基類的指針,來調用實現派生類中的方法。

問13:指針和引用的區別?

答:

1. 指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用僅是個別名;

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

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

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

5. 引用不能爲空,指針能夠爲空;

6. 「sizeof 引用」獲得的是所指向的變量(對象)的大小,而「sizeof 指針」獲得的是指針自己的大小;

7. 指針和引用的自增(++)運算意義不同;

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

9.從內存分配上看:程序爲指針變量分配內存區域,而引用不須要分配內存區域。

問14:什麼是內存泄漏?面對內存泄漏和指針越界,你有哪些方法?你一般採用哪些方法來避免和減小這類錯誤?

答:用動態存儲分配函數動態開闢的空間,在使用完畢後未釋放,結果致使一直佔據該內存單元即爲內存泄露。

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

malloc的時候得肯定在那裏free.

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

動態分配內存的指針最好不要再次賦值.

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

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

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

優勢:快,數據移動少

缺點:穩定性不足

2.歸併:分治法排序,穩定的排序算法,通常用於對整體無序,但局部有序的數列。

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

缺點:比較佔用內存

問16:new和malloc的區別?

答:

一、malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。

二、對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。

三、因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。

四、C++程序常常要調用C函數,而C程序只能用malloc/free管理動態內存。

五、new能夠認爲是malloc加構造函數的執行。new出來的指針是直接帶類型信息的。而malloc返回的都是void指針。

問17: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操做了。然而,當一個事件發生的時候,此完成端口就將被操做系統加入一個隊列中。而後應用程序能夠對核心層進行查詢以獲得此完成端口。

問18:同步IO和異步IO的區別?

答:

A. 同步

所謂同步,就是在發出一個功能調用時,在沒有獲得結果以前,該調用就不返回。

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

可是通常而言,咱們在說同步、異步的時候,特指那些須要其餘部件協做或者須要必定時間完成的任務。

最多見的例子就是 SendMessage。

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

當對方處理完畢之後,該函數才把消息處理函數所返回的值返回給調用者。

B. 異步

異步的概念和同步相對。

當一個異步過程調用發出後,調用者不會馬上獲得結果。

實際處理這個調用的部件是在調用發出後,經過狀態、通知來通知調用者,或經過回調函數處理這個調用。

問19:解釋C++中靜態函數和靜態變量?

答:

(1)類靜態數據成員在編譯時建立並初始化:在該類的任何對象創建以前就存在,不屬於任何對象,而非靜態類成員變量則是屬於對象全部的。類靜態數據成員只有一個拷貝,爲全部此類的對象所共享。

(2)類靜態成員函數屬於整個類,不屬於某個對象,由該類全部對象共享。

一、static 成員變量實現了同類對象間信息共享。

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

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

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

五、能夠經過類名訪問(無對象生成時亦可),也能夠經過對象訪問。

一、靜態成員函數的意義,不在於信息共享,數據溝通,而在於管理靜態數據成員,完成對靜態數據成員的封裝。

二、靜態成員函數只能訪問靜態數據成員。緣由:非靜態成員函數,在調用時 this指針時被看成參數傳進。而靜態成員函數屬於類,而不屬於對象,沒有 this 指針。

問20:說下你對內存的瞭解?

答:

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

2.堆 - 通常由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收

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

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

5 程序代碼區,存放2進制代碼。

在函數體中定義的變量一般是在棧上,用malloc, calloc, realloc等分配內存的函數分配獲得的就是在堆上。在全部函數體外定義的是全局量,加了static修飾符後無論在哪裏都存放在全局區(靜態區),在全部函數體外定義的static變量表示在該文件中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,函數中的"adgfdf"這樣的字符串存放在常量區。

相關文章
相關標籤/搜索