[收集] 經典C/C++面試題(一)

來源:互聯網
上載者:User

1.介紹一下STL,詳細說明STL如何?vector。
Answer:
     STL (標準模版庫,Standard Template Library)它由容器演算法迭代器組成。
     STL有以下的一些優點:
     可以方便容易地實現搜尋資料或對資料排序等一系列的演算法;
     偵錯工具時更加安全和方便;
     即使是人們用STL在UNIX平台下寫的代碼你也可以很容易地理解(因為STL是跨平台的)。
     vector實質上就是一個動態數組,會根據資料的增加,動態增加數組空間。

2.如果用VC開發程式,常見這麼幾個錯誤,C2001,c2005,c2011,這些錯誤的原因是什麼。
Answer:
  在學習VC++的過程中,遇到的LNK2001錯誤的錯誤訊息主要為:
  unresolved external symbol “symbol”(不確定的外部“符號”)。
    如果串連程式不能在所有的庫和目標檔案內找到所引用的函數、變數或標籤,將產生此錯誤訊息。
     一般來說,發生錯誤的原因有兩個:一是所引用的函數、變數不存在、拼字不正確或者使用錯誤;其次可能使用了不同版本的串連庫。
     編程中經常能遇到LNK2005錯誤——重複定義錯誤,其實LNK2005錯誤並不是一個很難解決的錯誤.
  
3.繼承和委派有什麼分別,在決定使用繼承或者委派的時候需要考慮什麼。
     在OOD,OOP中,組合優於繼承.
     當然多態的基礎是繼承,沒有繼承多態無從談起。
     當對象的類型不影響類中函數的行為時,就要使用模板來產生這樣一組類。
     當對象的類型影響類中函數的行為時,就要使用繼承來得到這樣一組類.

4.指標和引用有什麼分別;如果傳引用比傳指標安全,為什嗎?如果我使用常量指標難道不行嗎?
     (1) 引用在建立的同時必須初始化,即引用到一個有效對象;而指標在定義的時候不必初始化,可以在定義後面的任何地方重新賦值.
     (2) 不存在NULL引用,引用必須與合法的儲存單元關聯;而指標則可以是NULL.
     (3) 引用一旦被初始化為指向一個對象,它就不能被改變為另一個對象的引用;而指標在任何時候都可以改變為指向另一個對象.給引用賦值並不是改變它和原始對象的綁定關係.
     (4) 引用的建立和銷毀並不會調用類的拷貝建構函式
     (5) 語言層面,引用的用法和對象一樣;在二進位層面,引用一般都是通過指標來實現的,只不過編譯器幫我們完成了轉換.
     不存在Null 參考,並且引用一旦被初始化為指向一個對象,它就不能被改變為另一個對象的引用,顯得很安全。
     const 指標仍然存在null 指標,並且有可能產生野指標.
     總的來說:引用既具有指標的效率,又具有變數使用的方便性和直觀性.
 
5.參數傳遞有幾種方式;實現多態參數傳遞採用什麼方式,如果沒有使用某種方式原因是什麼;
     傳值,傳指標或者引用
 
6.結合一個項目說明你怎樣應用設計模式的理念。
     設計模式更多考慮是擴充和重用,而這兩方面很多情況下,往往會被忽略。
     不過,我不建議濫用設計模式,以為它有可能使得簡單問題複雜化.
 
7.介紹一下你對設計模式的理解。(這個過程中有很多很細節的問題隨機問的)
     設計模式概念是由建築設計師Christopher Alexander提出:"每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的解決方案的核心.這樣,你就能一次又一次地使用該方案而不必做重複勞動."上述定義是對設計模式的廣義定義.將其應用到物件導向軟體的領域內,就形成了對設計模式的狹義定義.
     可以簡單的認為:設計模式就是解決某個特定的物件導向軟體問題的特定方法, 並且已經上升到理論程度。
     架構與設計模式的區別:
     1,設計模式和架構針對的問題域不同.設計模式針對物件導向的問題域;架構針對特定業務的問題域
     2,設計模式比架構更為抽象.設計模式在碰到具體問題後,才能產生代碼;架構已經可以用代碼錶示
     3,設計模式是比架構更小的體繫結構元素.架構中可以包括多個設計模式
     設計模式就像武術中基本的招式.將這些招式合理地縱組合起來,就形成套路(架構),架構是一種半成品.
 
8.C++和C定義結構的分別是什麼。
     C language 的結構僅僅是資料的結合
     C plus plus的struct 和 class 其實具備幾乎一樣的功能,只是預設的訪問屬性不一樣而已。
 
9.建構函式可否是虛汗數,為什嗎?解構函式呢,可否是純虛的呢?
     建構函式不能為虛函數,要構造一個對象,必須清楚地知道要構造什麼,否則無法構造一個對象。
     解構函式可以為純虛函數。
 
10.拷貝建構函式相關問題,深拷貝,淺拷貝,臨時對象等。
     深拷貝意味著拷貝了資源和指標,而淺拷貝只是拷貝了指標,沒有拷貝資源
     這樣使得兩個指標指向同一份資源,造成對同一份析構兩次,程式崩潰。
     臨時對象的開銷比局部對象小些。
 
11.結合1個你認為比較能體現OOP思想的項目,用UML來描述。(最好這個項目繼承,多態,虛函數都有體現)這個問題大概會佔面試時間的一半,並且會問很多問題,一不小心可能會被問住)。
。。。

12.基類的有1個虛函數,子類還需要申明為virtual嗎?為什麼。
     不申明沒有關係的。
     不過,我總是喜歡顯式申明,使得代碼更加清晰。
 
13.C也可以通過精心封裝某些函數功能實現重用,那C++的類有什麼優點嗎,難道僅僅是為實現重用。
     並不僅僅是這樣的。
     OOD,OOP從根本上改變了程式設計模式和設計思想,具備重大和深遠的意義。
     類的三大最基本的特徵:封裝,繼承,多態.
 
14.C++特點是什麼,如何?多態?畫出基類和子類在記憶體中的相互關係。
     多態的基礎是繼承,需要虛函數的支援,簡單的多態是很簡單的。
     子類繼承父類大部分的資源,不能繼承的有建構函式,解構函式,拷貝建構函式,operator=函數,友元函數等等
 
15.為什麼要引入抽象基類和純虛函數?
     主要目的是為了實現一種介面的效果。
 
16.介紹一下模板和容器。如何??(也許會讓你當場舉例實現)
     模板可以說比較古老了,但是當前的泛型程式設計實質上就是模板編程。
     它體現了一種通用和泛化的思想。
     STL有7種主要容器:vector,list,deque,map,multimap,set,multiset.
 
17.你如何理解MVC。簡單舉例來說明其應用。
     MVC模式是observer 模式的一個特例,典型的有MFC裡面的文檔視圖架構。
 
18.多重繼承如何消除向上繼承的二義性。
     使用虛擬繼承即可.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.