經典C C 面試題

2021-04-25 08:49:26 字數 4774 閱讀 1112

c++面試題

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) 語言層面,引用的用法和物件一樣;在二進位制層面,引用一般都是通過指標來實現的,只不過編譯器幫我們完成了轉換.

不存在空引用,並且引用一旦被初始化為指向乙個物件,它就不能被改變為另乙個物件的引用,顯得很安全。

const 指標仍然存在空指標,並且有可能產生野指標.

總的來說:引用既具有指標的效率,又具有變數使用的方便性和直觀性.

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,多重繼承如何消除向上繼承的二義性。

使用虛擬繼承即可.

最近因為找工作,收集了很多c語言方面方面的面試題以及答案。現在新工作搞定了,決定把這些資料發出來,送給有需要的朋友,免得再象我一樣到處搜尋,實在辛苦。

發布之前先申明兩點:

1 所有資料來自網路(主要是csdn),本人只是收集和**。

2 所有問題解答(尤其是**)只是參考,不保證正確。

先發基本問題,再發程式設計問題

想成為嵌入式程式設計師應知道的0x10個基本問題:

預處理器(preprocessor)

1 . 用預處理指令#define 宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)

define seconds_per_year (60 * 60 * 24 * 365)ul

我在這想看到幾件事情:

1) #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

2)懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3) 意識到這個表示式將使乙個16位機的整型數溢位-因此要用到長整型符號l,告訴編譯器這個常數是的長整型數。

4) 如果你在你的表示式中用到ul(表示無符號長整型),那麼你有了乙個好的起點。記住,第一印象很重要。

2 . 寫乙個"標準"巨集min ,這個巨集輸入兩個引數並返回較小的乙個。

#define min(a,b) ((a) <= (b) ? (a) : (b))

這個測試是為下面的目的而設的:

1) 標識#define在巨集中應用的基本知識。這是很重要的。因為在嵌入(inline)操作符變為標準c的一部分之前,巨集是方便產生嵌入**的唯一方法,對於嵌入式系統來說,為了能達到要求的效能,嵌入**經常是必須的方法。

2)三重條件操作符的知識。這個操作符存在c語言中的原因是它使得編譯器能產生比if-then-else更優化的**,了解這個用法是很重要的。

3) 懂得在巨集中小心地把引數用括號括起來

4) 我也用這個問題開始討論巨集的***,例如:當你寫下面的**時會發生什麼事?

least = min(*p++, b);

3. 預處理器標識#error的目的是什麼?

如果你不知道答案,請看參考文獻1。這問題對區分乙個正常的夥計和乙個書呆子是很有用的。只有書呆子才會讀c語言課本的附錄去找出象這種問題的答案。

當然如果你不是在找乙個書呆子,那麼應試者最好希望自己不要知道答案。

死迴圈(infinite loops)

4. 嵌入式系統中經常要用到無限迴圈,你怎麼樣用c編寫死迴圈呢?

這個問題用幾個解決方案。我首選的方案是:

while(1)

一些程式設計師更喜歡如下方案:

for(;;)

這個實現方式讓我為難,因為這個語法沒有確切表達到底怎麼回事。如果乙個應試者給出這個作為方案,我將用這個作為乙個機會去**他們這樣做的基本原理。如果他們的基本答案是:

"我被教著這樣做,但從沒有想到過為什麼。"這會給我留下乙個壞印象。

第三個方案是用 goto

loop:

...goto loop;

應試者如給出上面的方案,這說明或者他是乙個組合語言程式設計師(這也許是好事)或者他是乙個想進入新領域的basic/fortran程式設計師。

資料宣告(data declarations)

經典C C 面試題

經典c c 面試題 一 1.介紹一下stl,詳細說明stl如何實現vector。stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用st...

經典的CC 的strcpy面試題

1.庫函式strcpy的工作方式 char strcpy char strdest,const char strsrc 2.找錯題 試題1 void test1 試題1字串str1需要11個位元組才能存放下 包括末尾的 0 而string只有10個位元組的空間,strcpy會導致陣列越界 試題2 v...

c c 程式設計面試題

c c 程式設計面試題07 c語言 c 程式設計面試題集錦 第七部分 1.介紹一下stl,詳細說明stl如何實現vector.answer stl 標準模版庫,standard template library.它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序...