大家好,我是檸檬哥,專(zhuān)注編程知識分享。
歡迎關(guān)注@程序員檸檬橙,編程路上不迷路,私信發(fā)送以下關(guān)鍵字獲取編程資源:
發(fā)送1024打包下載10個(gè)G編程資源學(xué)習資料
發(fā)送001獲取阿里大神LeetCode 刷題筆記
發(fā)送002獲取獲取谷歌公司編程代碼規范
發(fā)送003獲取10個(gè)精美簡(jiǎn)歷模板PDF和Word版
發(fā)送004獲取100道精選 C 面試題和答案word版
發(fā)送005獲取獲取谷歌LeetCode算法筆記
今天給大家分享一些經(jīng)典的C 面試題。
1.new、delete、malloc、free之間的關(guān)系
malloc 和 free 都是 C/C 語(yǔ)言的標準庫函數,new/delete 是 C 的運算符。
new 調用構造函數,delete 會(huì )調用對象的析構函數,而 free 只會(huì )釋放內存。
它們都可用于申請動(dòng)態(tài)內存和釋放內存。但對于非內部數據類(lèi)型的對象而言,光用 malloc/free 無(wú)法滿(mǎn)足動(dòng)態(tài)對象的要求。對象在創(chuàng )建的同時(shí)要自動(dòng)執行構造函數,對象在消亡之前要自動(dòng)執行析構函數。由于 malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務(wù)強加給 malloc/free。因此C 語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內存分配和初始化工作的運算符new,以及一個(gè)能完成清理與釋放內存工作的運算符 delete。注意:new/delete 不是庫函數。
2.delete和delete []的區別
delete 只會(huì )調用一次析構函數,而 delete[] 會(huì )調用每一個(gè)成員函數的析構函數。
在 More Effective C 中有更為詳細的解釋?zhuān)寒?delete 操作符用于數組時(shí),它為每個(gè)數組元素調用析構函數,然后調用 operator delete 來(lái)釋放內存。delete 與 new 配套,delete [] 與 new [] 配套
MemTest *mTest1=newMemTest[10];
MemTest *mTest2=newMemTest;
Int *pInt1=newint[10];
Int *pInt2=newint;delete[]pInt1;//-1-delete[]pInt2;//-2-delete[]mTest1;//-3-delete[]mTest2;//-4-
在 -4- 處報錯。
這就說(shuō)明:對于內建簡(jiǎn)單數據類(lèi)型,delete和delete[]功能是相同的。對于自定義的復雜數據類(lèi)型,delete和delete[]不能互用。delete[]刪除一個(gè)數組,delete刪除一個(gè)指針。簡(jiǎn)單來(lái)說(shuō),用new分配的內存用delete刪除;用new[]分配的內存用delete[]刪除。delete[]會(huì )調用數組元素的析構函數。內部數據類(lèi)型沒(méi)有析構函數,所以問(wèn)題不大。如果你在用delete時(shí)沒(méi)用括號,delete就會(huì )認為指向的是單個(gè)對象,否則,它就會(huì )認為指向的是一個(gè)數組。
3.C 有哪些性質(zhì)(面向對象特點(diǎn))
封裝、繼承和多態(tài)
4.子類(lèi)析構時(shí)要調用父類(lèi)的析構函數嗎?
析構函數調用的次序是先派生類(lèi)的析構后基類(lèi)的析構,也就是說(shuō)在基類(lèi)的的析構調用的時(shí)候,派生類(lèi)的信息已經(jīng)全部銷(xiāo)毀了。定義一個(gè)對象時(shí)先調用基類(lèi)的構造函數、然后調用派生類(lèi)的構造函數;析構的時(shí)候恰好相反:先調用派生類(lèi)的析構函數、然后調用基類(lèi)的析構函數。
5.介紹多態(tài)、虛函數和純虛函數。
多態(tài):是對于不同對象接收相同消息時(shí)產(chǎn)生不同的動(dòng)作。C 的多態(tài)性具體體現在運行和編譯兩個(gè)方面:在程序運行時(shí)的多態(tài)性通過(guò)繼承和虛函數來(lái)體現;在程序編譯時(shí)多態(tài)性體現在函數和運算符的重載上;
虛函數:在基類(lèi)中冠以關(guān)鍵字 virtual 的成員函數。它提供了一種接口界面。允許在派生類(lèi)中對基類(lèi)的虛函數重新定義。
純虛函數的作用:在基類(lèi)中為其派生類(lèi)保留一個(gè)函數的名字,以便派生類(lèi)根據需要對它進(jìn)行定義。作為接口而存在的純虛函數不具備函數的功能,一般不能直接被調用。
從基類(lèi)繼承來(lái)的純虛函數,在派生類(lèi)中仍是虛函數。如果一個(gè)類(lèi)中至少有一個(gè)純虛函數,那么這個(gè)類(lèi)被稱(chēng)為抽象類(lèi)(abstract class)。
抽象類(lèi)中不僅包括純虛函數,也可包括虛函數。抽象類(lèi)是必須用作派生其他類(lèi)的基類(lèi),而不能用于直接創(chuàng )建對象實(shí)例。但仍可使用指向抽象類(lèi)的指針支持運行時(shí)多態(tài)性。
注:
定義一個(gè)函數為虛函數,不代表函數為不被實(shí)現的函數。定義他為虛函數是為了允許用基類(lèi)的指針來(lái)調用子類(lèi)的這個(gè)函數。定義一個(gè)函數為純虛函數,才代表函數沒(méi)有被實(shí)現。
6.求下面函數的返回值(微軟)
intfunc(x){intcountx =0;
while(x)
{
countx ;
x = x