C-c++語言面試寶典整理_第1頁
C-c++語言面試寶典整理_第2頁
C-c++語言面試寶典整理_第3頁
C-c++語言面試寶典整理_第4頁
C-c++語言面試寶典整理_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、1.neew、delletee、malllocc、freee關(guān)系系deleete會會調(diào)用對對象的析析構(gòu)函數(shù)數(shù),和nnew對對應(yīng)frree只只會釋放放內(nèi)存,nnew調(diào)調(diào)用構(gòu)造造函數(shù)。malllocc與frree是是C+/C語語言的標(biāo)標(biāo)準(zhǔn)庫函函數(shù),nnew/delletee是C+的運運算符。它們都都可用于于申請動動態(tài)內(nèi)存存和釋放放內(nèi)存。對于非非內(nèi)部數(shù)數(shù)據(jù)類型型的對象象而言,光光用maalocc/frree無無法滿足足動態(tài)對對象的要要求。對對象在創(chuàng)創(chuàng)建的同同時要自自動執(zhí)行行構(gòu)造函函數(shù),對對象在消消亡之前前要自動動執(zhí)行析析構(gòu)函數(shù)數(shù)。由于于malllocc/frree是是庫函數(shù)數(shù)而不是是運算符符,不在在

2、編譯器器控制權(quán)權(quán)限之內(nèi)內(nèi),不能能夠把執(zhí)執(zhí)行構(gòu)造造函數(shù)和和析構(gòu)函函數(shù)的任任務(wù)強加加于maallooc/ffreee。因此此C+語言需需要一個個能完成成動態(tài)內(nèi)內(nèi)存分配配和初始始化工作作的運算算符neew,以以及一個個能完成成清理與與釋放內(nèi)內(nèi)存工作作的運算算符deelette。注注意neew/ddeleete不不是庫函函數(shù)。2.deelette與 delletee 區(qū)別?delletee只會調(diào)調(diào)用一次次析構(gòu)函函數(shù),而而delletee會會調(diào)用每每一個成成員的析析構(gòu)函數(shù)數(shù)。在MMoreeEfffecttiveeC+中有更更為詳細(xì)細(xì)的解釋釋:“當(dāng)deelette操作作符用于于數(shù)組時時,它為為每個數(shù)數(shù)組元

3、素素調(diào)用析析構(gòu)函數(shù)數(shù),然后后調(diào)用ooperratoordeelette來釋釋放內(nèi)存存?!眃elletee與Neew配套套,deelette 與nnew 配配套 MeemTeest*mTeest11=neewMeemTeest10;MeemTeest*mTeest22=neewMeemTeest;intt*pIInt11=neewinnt110; innt*ppIntt2=nnewiint; deelettepInnt1; /-11- ddeleetepIInt22; /-2- delleteemmTesst1;/-3- delleteemmTesst2;/-4-在-4-處報錯錯。這就就說明:對

4、于內(nèi)內(nèi)建簡單單數(shù)據(jù)類類型,ddeleete和和delletee功功能是相相同的。對于自自定義的的復(fù)雜數(shù)數(shù)據(jù)類型型,deelette和ddeleete不能能互用。delletee刪刪除一個個數(shù)組,ddeleete刪刪除一個個指針簡簡單來說說,用nnew分分配的內(nèi)內(nèi)存用ddeleete刪刪除用nnew分配配的內(nèi)存存用deelette刪除ddeleete會調(diào)調(diào)用數(shù)組組元素的的析構(gòu)函函數(shù)。內(nèi)內(nèi)部數(shù)據(jù)據(jù)類型沒沒有析構(gòu)構(gòu)函數(shù),所所以問題題不大。如果你你在用ddeleete時時沒用括括號,ddeleete就就會認(rèn)為為指向的的是單個個對象,否否則,它它就會認(rèn)認(rèn)為指向向的是一一個數(shù)組組。3.C C+ JAAVA

5、共共同點,不不同之處處?4.繼承承優(yōu)缺點點。類繼繼承是在在編譯時時刻靜態(tài)態(tài)定義的的,且可可直接使使用,類類繼承可可以較方方便地改改變父類類的實現(xiàn)現(xiàn)。但是是類繼承承也有一一些不足足之處。首先,因因為繼承承在編譯譯時刻就就定義了了,所以以無法在在運行時時刻改變變從父類類繼承的的實現(xiàn)。更糟的的是,父父類通常常至少定定義了子子類的部部分行為為,父類類的任何何改變都都可能影影響子類類的行為為。如果果繼承下下來的實實現(xiàn)不適適合解決決新的問問題,則則父類必必須重寫寫或被其其他更適適合的類類替換。這種依依賴關(guān)系系限制了了靈活性性并最終終限制了了復(fù)用性性。(待待補充)5.C+有哪哪些性質(zhì)質(zhì)(面向向?qū)ο筇靥攸c)?

6、封裝,繼繼承和多多態(tài)。在在面向?qū)ο蟪绦蛐蛟O(shè)計語語言中,封封裝是利利用可重重用成分分構(gòu)造軟軟件系統(tǒng)統(tǒng)的特性性,它不不僅支持持系統(tǒng)的的可重用用性,而而且還有有利于提提高系統(tǒng)統(tǒng)的可擴擴充性;消息傳傳遞可以以實現(xiàn)發(fā)發(fā)送一個個通用的的消息而而調(diào)用不不同的方方法;封封裝是實實現(xiàn)信息息隱蔽的的一種技技術(shù),其其目的是是使類的定定義和實實現(xiàn)分離離。6.子類類析構(gòu)時時要調(diào)用用父類的的析構(gòu)函函數(shù)嗎?析構(gòu)函函數(shù)調(diào)用用的次序序是先派派生類的的析構(gòu)后后基類的的析構(gòu),也也就是說說在基類類的的析析構(gòu)調(diào)用用的時候候,派生生類的信信息已經(jīng)經(jīng)全部銷銷毀了。定義一一個對象象時先調(diào)調(diào)用基類類的構(gòu)造造函數(shù)、然后調(diào)調(diào)用派生生類的構(gòu)構(gòu)造函

7、數(shù)數(shù);析構(gòu)構(gòu)的時候候恰好相相反:先先調(diào)用派派生類的的析構(gòu)函函數(shù)、然然后調(diào)用用基類的的析構(gòu)函函數(shù)JAAVA無無析構(gòu)函函數(shù)深拷拷貝和淺淺拷貝 7.多態(tài)態(tài),虛函函數(shù),純純虛函數(shù)數(shù)8.求下下面函數(shù)數(shù)的返回回值(微微軟)int funnc(xx) iint couuntxx = 0; whhilee(x) ccounntx +; xx = x&(x-11); rretuurn couuntxx; 假定x = 999999。 答答案:88。思路:將x轉(zhuǎn)轉(zhuǎn)化為22進制,看看含有的的1的個個數(shù)。9.什么么是“引引用”?申明和和使用“引引用”要要注意哪哪些問題題?答:引用用就是某某個目標(biāo)標(biāo)變量的的“別名名”(a

8、aliaas),對對引用的操操作與對對變量直直接操作作效果完完全相同同。申明明一個引引用的時時候,切切記要對對其進行行初始化化。引用用聲明完完畢后,相相當(dāng)于目目標(biāo)變量量名有兩兩個名稱稱,即該該目標(biāo)原原名稱和和引用名名,不能能再把該該引用名名作為其其他變量量名的別別名。聲聲明一個個引用,不不是新定定義了一一個變量量,它只只表示該該引用名名是目標(biāo)標(biāo)變量名名的一個個別名,它它本身不不是一種種數(shù)據(jù)類類型,因此引引用本身身不占存存儲單元元,系統(tǒng)統(tǒng)也不給給引用分分配存儲儲單元。不能建建立數(shù)組組的引用用。10.將將“引用用”作為為函數(shù)參參數(shù)有哪哪些特點點?(1)傳傳遞引用用給函數(shù)數(shù)與傳遞遞指針的的效果是是一

9、樣的的。這時時,被調(diào)調(diào)函數(shù)的的形參就就成為原原來主調(diào)調(diào)函數(shù)中中的實參參變量或或?qū)ο蟮牡囊粋€別別名來使使用,所所以在被被調(diào)函數(shù)數(shù)中對形形參變量量的操作作就是對對其相應(yīng)應(yīng)的目標(biāo)標(biāo)對象(在在主調(diào)函函數(shù)中)的的操作。(2)使使用引用用傳遞函函數(shù)的參參數(shù),在在內(nèi)存中中并沒有有產(chǎn)生實實參的副副本,它它是直接接對實參參操作;而使用用一般變變量傳遞遞函數(shù)的的參數(shù),當(dāng)當(dāng)發(fā)生函函數(shù)調(diào)用用時,需需要給形形參分配配存儲單單元,形形參變量量是實參參變量的的副本;如果傳傳遞的是是對象,還還將調(diào)用用拷貝構(gòu)構(gòu)造函數(shù)數(shù)。因此此,當(dāng)參參數(shù)傳遞遞的數(shù)據(jù)據(jù)較大時時,用引引用比用用一般變變量傳遞遞參數(shù)的的效率和和所占空空間都好好。(3

10、)使使用指針針作為函函數(shù)的參參數(shù)雖然然也能達達到與使使用引用用的效果果,但是是,在被被調(diào)函數(shù)數(shù)中同樣樣要給形形參分配配存儲單單元,且且需要重重復(fù)使用用*指指針變量量名的的形式進進行運算算,這很很容易產(chǎn)產(chǎn)生錯誤誤且程序序的閱讀讀性較差差;另一一方面,在在主調(diào)函函數(shù)的調(diào)調(diào)用點處處,必須須用變量量的地址址作為實實參。而而引用更更容易使使用,更更清晰。11.在在什么時時候需要要使用“常常引用”?如果既既要利用用引用提提高程序序的效率率,又要要保護傳傳遞給函函數(shù)的數(shù)數(shù)據(jù)不在在函數(shù)中中被改變變,就應(yīng)應(yīng)使用常常引用。常引用用聲明方方式:cconsst 類類型標(biāo)識識符 &引用名名=目標(biāo)標(biāo)變量名名;例1innt

11、 aa ;cconsst iint &raa=a;ra=1; /錯錯誤a=1; /正正確 例2sttrinng ffoo( );voiid bbar(strringg & s); 那么下面面的表達達式將是是非法的的:bar(fooo( );bbar(heelloo woorldd); 原因在于于fooo( )和hhelllo wworlld串串都會產(chǎn)產(chǎn)生一個個臨時對對象,而而在C+中,這這些臨時時對象都都是coonstt類型的的。因此此上面的的表達式式就是試試圖將一一個coonstt類型的的對象轉(zhuǎn)轉(zhuǎn)換為非非connst類類型,這這是非法法的。引引用型參參數(shù)應(yīng)該該在能被被定義為為connst的的

12、情況下下,盡量量定義為為connst 。12.將將“引用用”作為為函數(shù)返返回值類類型的格格式、好好處和需需要遵守守的規(guī)則則?格式:類類型標(biāo)識識符 &函數(shù)名名(形參參列表及及類型說說明) /函數(shù)體體 好處:在在內(nèi)存中中不產(chǎn)生生被返回回值的副副本;(注注意:正正是因為為這點原原因,所所以返回回一個局局部變量量的引用用是不可可取的。因為隨隨著該局局部變量量生存期期的結(jié)束束,相應(yīng)應(yīng)的引用用也會失失效,產(chǎn)產(chǎn)生ruuntiime errror!注意事事項:(1)不不能返回回局部變變量的引引用。這這條可以以參照EEffeectiive C+1的Ittem 31。主要原原因是局局部變量量會在函函數(shù)返回回后被銷

13、銷毀,因因此被返返回的引引用就成成為了無所指指的引引用,程程序會進進入未知知狀態(tài)。 (2)不不能返回回函數(shù)內(nèi)內(nèi)部neew分配配的內(nèi)存存的引用用。這條條可以參參照Efffecctivve CC+1的的Iteem 331。雖雖然不存存在局部部變量的的被動銷銷毀問題題,可對對于這種種情況(返返回函數(shù)數(shù)內(nèi)部nnew分分配內(nèi)存存的引用用),又又面臨其其它尷尬尬局面。例如,被被函數(shù)返返回的引引用只是是作為一一個臨時時變量出出現(xiàn),而而沒有被被賦予一一個實際際的變量量,那么么這個引引用所指指向的空空間(由由neww分配)就就無法釋釋放,造造成meemorry lleakk。(3)可可以返回回類成員員的引用用,

14、但最最好是cconsst。這這條原則則可以參參照Efffecctivve CC+1的的Iteem 330。主主要原因因是當(dāng)對對象的屬屬性是與與某種業(yè)業(yè)務(wù)規(guī)則則(buusinnesss ruule)相相關(guān)聯(lián)的的時候,其其賦值常常常與某某些其它它屬性或或者對象象的狀態(tài)態(tài)有關(guān),因因此有必必要將賦賦值操作作封裝在在一個業(yè)業(yè)務(wù)規(guī)則則當(dāng)中。如果其其它對象象可以獲獲得該屬屬性的非非常量引引用(或或指針),那那么對該該屬性的的單純賦賦值就會會破壞業(yè)業(yè)務(wù)規(guī)則則的完整整性。(4)流流操作符符重載返返回值申申明為“引引用”的的作用:流操作作符,這兩兩個操作作符常常常希望被被連續(xù)使使用,例例如:ccoutt hhel

15、llo enddl;因此這這兩個操操作符的的返回值值應(yīng)該是是一個仍仍然支持持這兩個個操作符符的流引引用??煽蛇x的其其它方案案包括:返回一一個流對對象和返返回一個個流對象象指針。但是對對于返回回一個流流對象,程程序必須須重新(拷拷貝)構(gòu)構(gòu)造一個個新的流流對象,也也就是說說,連續(xù)續(xù)的兩個個操操作符實實際上是是針對不不同對象象的!這這無法讓讓人接受受。對于于返回一一個流指指針則不不能連續(xù)續(xù)使用操作作符。因因此,返返回一個個流對象象引用是是惟一選選擇。這這個唯一一選擇很很關(guān)鍵,它它說明了了引用的的重要性性以及無無可替代代性,也也許這就就是C+語言言中引入入引用這這個概念念的原因因吧。 賦值操操作符=。

16、這個個操作符符象流操操作符一一樣,是是可以連連續(xù)使用用的,例例如:xx = j = 100;或者者(x=10)=1000;賦賦值操作作符的返返回值必必須是一一個左值值,以便便可以被被繼續(xù)賦賦值。因因此引用用成了這這個操作作符的惟惟一返回回值選擇擇。例3i nncluude intt &pput(intt n);innt vvalss100;iint errror=-1;voiid mmainn()putt(0)=100; /以pput(0)函函數(shù)值作作為左值值,等價價于vaals0=10; puut(99)=220; /以以putt(9)函數(shù)值值作為左左值,等等價于vvalss9=200; c

17、couttvvalss0; ccoutt=0 & n=9 ) reeturrn vvalssn; eelsee couutsuubsccrippt eerroor; reeturrn eerroor; (5)在在另外的的一些操操作符中中,卻千千萬不能能返回引引用:+-*/ 四則則運算符符。它們們不能返返回引用用,Efffecctivve CC+1的的Iteem233詳細(xì)的的討論了了這個問問題。主主要原因因是這四四個操作作符沒有有sidde eeffeect,因因此,它它們必須須構(gòu)造一一個對象象作為返返回值,可可選的方方案包括括:返回回一個對對象、返返回一個個局部變變量的引引用,返返回一個個ne

18、ww分配的的對象的的引用、返回一一個靜態(tài)態(tài)對象引引用。根根據(jù)前面面提到的的引用作作為返回回值的三三個規(guī)則則,第22、3兩兩個方案案都被否否決了。靜態(tài)對對象的引引用又因因為(a+bb) = (c+dd)會會永遠(yuǎn)為為truue而導(dǎo)導(dǎo)致錯誤誤。所以以可選的的只剩下下返回一一個對象象了。13.“引引用”與與多態(tài)的的關(guān)系?引用是是除指針針外另一一個可以以產(chǎn)生多多態(tài)效果果的手段段。這意意味著,一個基類的引用可以指向它的派生類實例。例4Class A; Class B : Class A.; B b; A& ref = b;14.“引引用”與與指針的的區(qū)別是是什么?1) 引用必必須被初初始化,指指針不必必。

19、 22) 引引用初始始化以后后不能被被改變,指指針可以以改變所所指的對對象。 2) 不存在在指向空空值的引引用,但但是存在在指向空空值的指指針。指指針通過過某個指指針變量量指向一一個對象象后,對對它所指指向的變變量間接接操作。程序中中使用指指針,程程序的可可讀性差差;而引引用本身身就是目目標(biāo)變量量的別名名,對引引用的操操作就是是對目標(biāo)標(biāo)變量的的操作。此外,就就是上面面提到的的對函數(shù)數(shù)傳reef和ppoinnterr的區(qū)別別。15.什什么時候候需要“引引用”?流操作作符、賦值值操作符符=的返返回值、拷貝構(gòu)構(gòu)造函數(shù)數(shù)的參數(shù)數(shù)、賦值值操作符符=的參參數(shù)、其其它情況況都推薦薦使用引引用。以以上 22-

20、8 參考:htttp:/deevellop.csaai.ccn/cc/NOO000000221.hhtm16.結(jié)結(jié)構(gòu)與聯(lián)聯(lián)合有和和區(qū)別?(1). 結(jié)結(jié)構(gòu)和聯(lián)聯(lián)合都是是由多個個不同的的數(shù)據(jù)類類型成員員組成, 但在在任何同同一時刻刻, 聯(lián)聯(lián)合中只只存放了了一個被被選中的的成員(所所有成員員共用一一塊地址址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。(2).對于聯(lián)合的不同成員賦值, 將會對其它成員重寫,原來成員的值就不存在了, 而對于結(jié)構(gòu)的不同成員賦值是互不影響的。17.面面關(guān)于“聯(lián)聯(lián)合”的的題目的的輸出?a)ii nccludde uunioonintt i;chaar xx2;a

21、a;voiddmaain()a.xx0 = 10; a.x11 = 1;priintff(%d,a.ii);答案:2666 (低低位低地地址,高高位高地地址,內(nèi)內(nèi)存占用用情況是是Ox0010AA)b)maain() unnionn /*定義義一個聯(lián)聯(lián)合*/ innt ii; sstruuct /*在聯(lián)合合中定義義一個結(jié)結(jié)構(gòu)*/ chaar ffirsst; ccharr seeconnd; haalf; nummberr; nummberr.i=0 x442411; /*聯(lián)合成成員賦值值*/ prrinttf(%c%cn, nnumbber.hallf.ffirsst, mummberr.ha

22、alf.seccondd); nuumbeer.hhalff.fiirstt=aa; /*聯(lián)合合中結(jié)構(gòu)構(gòu)成員賦賦值*/ nnumbber.hallf.ssecoond=b; priintff(%xn, nnumbber.i); ggetcch(); 答案: ABB (0 xx41對對應(yīng)AA,是是低位;Ox442對應(yīng)應(yīng)B,是高高位)62661 (nummberr.i和和nummberr.haalf共共用一塊塊地址空空間)18.關(guān)關(guān)聯(lián)、聚聚合(AAggrregaatioon)以以及組合合(Coompoosittionn)的區(qū)區(qū)別?涉及到UUML中中的一些些概念:關(guān)聯(lián)是是表示兩兩個類的的一般性性聯(lián)系

23、,比比如“學(xué)學(xué)生”和和“老師師”就是是一種關(guān)關(guān)聯(lián)關(guān)系系;聚合合表示hhas-a的關(guān)關(guān)系,是是一種相相對松散散的關(guān)系系,聚合合類不需需要對被被聚合類類負(fù)責(zé),如如下圖所所示,用用空的菱菱形表示示聚合關(guān)關(guān)系:從從實現(xiàn)的的角度講講,聚合合可以表表示為:classs AA . cclasss BB A* a; .而組合表表示coontaainss-a的的關(guān)系,關(guān)關(guān)聯(lián)性強強于聚合合:組合合類與被被組合類類有相同同的生命命周期,組組合類要要對被組組合類負(fù)負(fù)責(zé),采采用實心心的菱形形表示組組合關(guān)系系:實現(xiàn)現(xiàn)的形式式是:cclasss AA. claass B A aa; .27.maiin 函函數(shù)執(zhí)行行以前,還

24、還會執(zhí)行行什么代代碼?答答案:全全局對象象的構(gòu)造造函數(shù)會會在maain 函數(shù)之之前執(zhí)行行。28.描述內(nèi)內(nèi)存分配配方式以以及它們們的區(qū)別別?1)從靜靜態(tài)存儲儲區(qū)域分分配。內(nèi)存在在程序編編譯時就就已經(jīng)分分配好,這這塊內(nèi)存存在程序序的整個個運行期期間都存存在。例例如全局局變量,sstattic 變量。2)在棧棧上創(chuàng)建建。在執(zhí)執(zhí)行函數(shù)數(shù)時,函函數(shù)內(nèi)局局部變量量的存儲儲單元都都可以在在棧上創(chuàng)創(chuàng)建,函函數(shù)執(zhí)行行結(jié)束時時這些存存儲單元元自動被被釋放。棧內(nèi)存存分配運運算內(nèi)置置于處理理器的指指令集。3)從堆堆上分配配,亦稱稱動態(tài)內(nèi)內(nèi)存分配配。程序在在運行時時用maallooc 或或neww 申請請任意多多少的內(nèi)

25、內(nèi)存,程程序員自自己負(fù)責(zé)責(zé)在何時時用frree 或deelette 釋釋放內(nèi)存存。動態(tài)態(tài)內(nèi)存的的生存期期由程序序員決定定,使用用非常靈靈活,但但問題也也最多。29.sstruuct 和 cclasss 的的區(qū)別答案:sstruuct 的成員員默認(rèn)是是公有的的,而類類的成員員默認(rèn)是是私有的的。sttrucct 和和 cllasss 在其其他方面面是功能能相當(dāng)?shù)牡摹母懈星樯现v講,大多多數(shù)的開開發(fā)者感感到類和和結(jié)構(gòu)有有很大的的差別。感覺上上結(jié)構(gòu)僅僅僅象一一堆缺乏乏封裝和和功能的的開放的的內(nèi)存位位,而類類就象活活的并且且可靠的的社會成成員,它它有智能能服務(wù),有有牢固的的封裝屏屏障和一一個良好好定義的

26、的接口。既然大大多數(shù)人人都這么么認(rèn)為,那那么只有有在你的的類有很很少的方方法并且且有公有有數(shù)據(jù)(這這種事情情在良好好設(shè)計的的系統(tǒng)中中是存在在的!)時時,你也也許應(yīng)該該使用 strructt 關(guān)鍵鍵字,否否則,你你應(yīng)該使使用 cclasss 關(guān)關(guān)鍵字。30.當(dāng)當(dāng)一個類類A 中中沒有任任何成員員變量與與成員函函數(shù),這這時siizeoof(AA)的值值是多少少?答案:如如果不是是零,請請解釋一一下編譯譯器為什什么沒有有讓它為為零。(AAutoodessk)肯肯定不是是零。舉舉個反例例,如果果是零的的話,聲聲明一個個claass A110對對象數(shù)組組,而每每一個對對象占用用的空間間是零,這這時就沒沒辦

27、法區(qū)區(qū)分A0,A11了。值 為1.32.比較CC+中中的4種種類型轉(zhuǎn)轉(zhuǎn)換方式式?請參考:htttp:/bllog.csddn.nnet/wfwwd/aarchhivee/20006/05/30/76337855.asspx,重重點是sstattic_casst, dynnamiic_ccastt和reeintterpprett_caast的的區(qū)別和和應(yīng)用。dynaamicc_caastss在幫助助你瀏覽覽繼承層層次上是是有限制制的。它它不能被被用于缺缺乏虛函函數(shù)的類類型上,它它被用于于安全地地沿著類類的繼承承關(guān)系向向下進行行類型轉(zhuǎn)轉(zhuǎn)換。如如你想在在沒有繼繼承關(guān)系系的類型型中進行行轉(zhuǎn)換,你你可能

28、想想到sttatiic_ccastt44.寫寫一個在在一個字字符串(n)中中尋找一一個子串串(m)第一個個位置的的函數(shù)。KMP算算法效率率最好,時時間復(fù)雜雜度是(n+m),詳見:htttp:/wwww.zzhanngliihaii.coom/bblogg/c_3355_kmmp.hhtmll48.指指針找錯錯題分析這些些面試題題,本身身包含很很強的趣趣味性;而作為為一名研研發(fā)人員員,通過過對這些些面試題題的深入入剖析則則可進一一步增強強自身的的內(nèi)功。2.找找錯題試試題1:以下是是引用片片段:vvoidd teest11() /數(shù)組越越界chhar strringg100;chhar* sttr

29、1 = 0122345567889;sttrcppy( strringg, sstr11 );試題2:以下下是引用用片段:voiid ttestt2()chaar sstriing10, sstr11100; iint i;foor(ii=0; i10; i+)sttr1= aa;sttrcppy( strringg, sstr11 );試試題3:以以下是引引用片段段:vooid tesst3(chaar* strr1)chhar strringg100;iff( sstrllen( sttr1 ) = 110 )sstrccpy( sttrinng, strr1 );解答:試題11字符串串s

30、trr1需要要11個個字節(jié)才才能存放放下(包包括末尾尾的0),而而strringg只有110個字字節(jié)的空空間,sstrccpy會會導(dǎo)致數(shù)數(shù)組越界界;試題22,如果果面試者者指出字字符數(shù)組組strr1不能能在數(shù)組組內(nèi)結(jié)束束可以給給3分;如果面面試者指指出sttrcppy(sstriing,strr1)調(diào)調(diào)用使得得從 sstr11內(nèi)存起起復(fù)制到到strringg內(nèi)存起起所復(fù)制制的字節(jié)節(jié)數(shù)具有有不確定定性可以以給7分分,在此此基礎(chǔ)上上指出庫庫函數(shù)sstrccpy工工作方式式的給110分;對試題題3,iif(sstrllen(strr1) = 10)應(yīng)改為為if(strrlenn(sttr1) 110

31、),因因為sttrleen的結(jié)結(jié)果未統(tǒng)統(tǒng)計0所占占用的11個字節(jié)節(jié)。剖析析:考查查對基本本功的掌掌握(1)字符串串以0結(jié)尾尾;(2)對對數(shù)組越越界把握握的敏感感度;(33)庫函函數(shù)sttrcppy的工工作方式式,49.如如果編寫寫一個標(biāo)標(biāo)準(zhǔn)sttrcppy函數(shù)?總分值值為100,下面面給出幾幾個不同同得分的的答案:2分以下是是引用片片段:vvoidd sttrcppy( chaar *strrDesst, chaar *strrSrcc )whhilee( (*sttrDeest+ = * strrSrcc+) != 0 );4分以下是是引用片片段:voiid sstrccpy( chhar

32、*sttrDeest, coonstt chhar *sttrSrrc )/將源源字符串串加coonstt,表明明其為輸輸入?yún)?shù)數(shù),加22分whiile( (*strrDesst+ = * sstrSSrc+) != 00 );7分以以下是引引用片段段:vooid strrcpyy(chhar *sttrDeest, coonstt chhar *sttrSrrc)/對源地地址和目目的地址址加非00斷言,加加3分assserrt( (sttrDeest != NULLL) &(strrSrcc != NUULL) );wwhille( (*sstrDDestt+ = * sttrSrrc+)

33、!= 0 );110分以以下是引引用片段段:/為了實實現(xiàn)鏈?zhǔn)绞讲僮?,將將目的地地址返回回,?3分!chhar * sstrccpy( chhar *sttrDeest, coonstt chhar *sttrSrrc )aasseert( (sstrDDestt != NUULL) &(sttrSrrc != NNULLL) ); /對源源地址和和目的地地址加非非0斷言言ccharr *aaddrresss = strrDesst;whhilee( (*sttrDeest+ = * strrSrcc+) != 0 );retturnn adddreess; /為了實實現(xiàn)鏈?zhǔn)绞讲僮?,將將目的?/p>

34、地址返回回從從2分到到10分分的幾個個答案我我們可以以清楚的的看到,小小小的sstrccpy竟竟然暗藏藏著這么么多玄機機,真不不是蓋的的!需要要多么扎扎實的基基本功才才能寫一一個完美美的sttrcppy啊!(4)對sttrleen的掌掌握,它它沒有包包括字符符串末尾尾的0。讀者看看了不同同分值的的strrcpyy版本,應(yīng)應(yīng)該也可可以寫出出一個110分的的strrlenn函數(shù)了了, int strrlenn( cconsst ccharr *sstr ) /輸入入?yún)?shù)cconsst以以下是引引用片段段:aasseert( sttrt != NULLL ); /斷言言字符串串地址非非0intt l

35、een=00; /注,一一定要初初始化。wwhille( (*sstr+) != 00 )llen+;reeturrn llen;試試題4:以下是是引用片片段:vvoidd GeetMeemorry( chaar *p )/內(nèi)內(nèi)存分配配pp = (chhar *) malllocc( 1100 );vooid Tesst( voiid )ccharr *sstr = NNULLL;GettMemmoryy( sstr );sttrcppy( strr, helllo worrld );pprinntf( sttr ); 試題題5:以以下是引引用片段段:chhar *GeetMeemorry(

36、voiid )ccharr p = hhelllo wworlld;rretuurn p;vooid Tesst( voiid )ccharr *sstr = NNULLL;strr = GettMemmoryy();pprinntf( sttr );試題66:以下下是引用用片段:voiid GGetMMemoory( chhar *pp, iint numm )*pp = (chhar *) malllocc( nnum );vooid Tesst( voiid )ccharr *sstr = NNULLL;GettMemmoryy( &strr, 1100 );sttrcppy( strr

37、, helllo );pprinntf( sttr );試題77:以下下是引用用片段:vooid Tesst( voiid )ccharr *sstr = (chaar *) mmallloc( 1000 );strrcpyy( sstr, hhelllo );frree( sttr );. /省略的的其它語語句解答:試題4傳入中中GettMemmoryy( ccharr *pp )函函數(shù)的形形參為字字符串指指針,在在函數(shù)內(nèi)內(nèi)部修改改形參并并不能真真正的改改變傳入入形參的的值,執(zhí)執(zhí)行完ccharr *sstr = NNULLL;GeetMeemorry( strr );后的的strr仍然為為N

38、ULLL;試試題5中中chaar pp = helllo worrld;reeturrn pp;的p數(shù)組為為函數(shù)內(nèi)內(nèi)的局部部自動變變量,在在函數(shù)返返回后,內(nèi)內(nèi)存已經(jīng)經(jīng)被釋放放。這是是許多程程序員常常犯的錯錯誤,其其根源在在于不理理解變量量的生存存期。試試題6的的GettMemmoryy避免了了試題44的問題題,傳入入GettMemmoryy的參數(shù)數(shù)為字符符串指針針的指針針,但是是在GeetMeemorry中執(zhí)執(zhí)行申請請內(nèi)存及及賦值語語句*p = (chaar *) mmallloc( nuum );后未判斷斷內(nèi)存是是否申請請成功,應(yīng)應(yīng)加上:if ( *p = NNULLL )./進進行申請請內(nèi)

39、存失失敗處理理試題77存在與與試題66同樣的的問題,在在執(zhí)行ccharr *sstr = (chaar *) mmallloc(1000);后后未進行行內(nèi)存是是否申請請成功的的判斷;另外,在在freee(sstr)后未置置strr為空,導(dǎo)導(dǎo)致可能能變成一一個“野野”指針針,應(yīng)加加上:sstr = NNULLL;試題題6的TTestt函數(shù)中中也未對對malllocc的內(nèi)存存進行釋釋放。剖析析:試題題477考查面面試者對對內(nèi)存操操作的理理解程度度,基本本功扎實實的面試試者一般般都能正正確的回回答其中中5060的的錯誤。但是要要完全解解答正確確,卻也也絕非易易事。 對內(nèi)存操操作的考考查主要要集中在在

40、:(11)指針針的理解解;(2)變量的的生存期期及作用用范圍;(3)良好的的動態(tài)內(nèi)內(nèi)存申請請和釋放放習(xí)慣。再看看看下面的的一段程程序有什什么錯誤誤:以下是是引用片片段:sswapp( iint* p11,innt* p2 )innt *p;*pp = *p11;*p11 = *p22;*p22 = *p;在swwap函函數(shù)中,pp是一個個“野”指指針,有有可能指指向系統(tǒng)統(tǒng)區(qū),導(dǎo)導(dǎo)致程序序運行的的崩潰。在VCC+中中DEBBUG運運行時提提示錯誤誤“Acccesss VViollatiion”。該程序應(yīng)該改為以下是引用片段:swap( int* p1,int* p2 )int p;p = *p1

41、;*p1 = *p2;*p2 = p;51.hh頭文件件中的iifnddef/deffinee/enndiff 的作作用?答答:防止止該頭文文件被重重復(fù)引用用。52.i nncluude 與與 ii nccludde fille.hh的區(qū)區(qū)別?答:前者者是從SStanndarrd LLibrraryy的路徑徑尋找和和引用ffilee.h,而而后者是是從當(dāng)前前工作路路徑搜尋尋并引用用fille.hh。53.在CC+ 程序中中調(diào)用被被C 編編譯器編編譯后的的函數(shù),為為什么要要加exxterrn “CC”?C+語語言支持持函數(shù)重重載,CC語言不不支持函函數(shù)重載載。C+提供供了C連連接交換換指定符符號

42、exxterrn “C”解決名名字匹配配問題。首先,作作為exxterrn是CC/C+語言言中表明明函數(shù)和和全局變變量作用用范圍(可可見性)的的關(guān)鍵字字,該關(guān)關(guān)鍵字告告訴編譯譯器,其其聲明的的函數(shù)和和變量可可以在本本模塊或或其它模模塊中使使用。通常,在在模塊的的頭文件件中對本本模塊提提供給其其它模塊塊引用的的函數(shù)和和全局變變量以關(guān)關(guān)鍵字eexteern聲聲明。例例如,如如果模塊塊B欲引引用該模模塊A中中定義的的全局變變量和函函數(shù)時只只需包含含模塊AA的頭文文件即可可。這樣樣,模塊塊B中調(diào)調(diào)用模塊塊A中的的函數(shù)時時,在編編譯階段段,模塊塊B雖然然找不到到該函數(shù)數(shù),但是是并不會會報錯;它會在在連接

43、階階段中從從模塊AA編譯生生成的目目標(biāo)代碼碼中找到到此函數(shù)數(shù)。extternn CC是連連接申明明(liinkaage decclarratiion),被eexteern C修飾的的變量和和函數(shù)是是按照CC語言方方式編譯譯和連接接的,來來看看CC+中中對類似似C的函函數(shù)是怎怎樣編譯譯的:作作為一種種面向?qū)ο蟮恼Z語言,CC+支支持函數(shù)數(shù)重載,而而過程式式語言CC則不支支持。函函數(shù)被CC+編編譯后在在符號庫庫中的名名字與CC語言的的不同。例如,假假設(shè)某個個函數(shù)的的原型為為:vooid fooo( iint x, intt y );該該函數(shù)被被C編譯譯器編譯譯后在符符號庫中中的名字字為_ffoo,

44、而而C+編譯器器則會產(chǎn)產(chǎn)生像_fooo_innt_iint之之類的名名字(不不同的編編譯器可可能生成成的名字字不同,但但是都采采用了相相同的機機制,生生成的新新名字稱稱為“mmanggledd naame”)。_fooo_iint_intt 這樣樣的名字字包含了了函數(shù)名名、函數(shù)數(shù)參數(shù)數(shù)數(shù)量及類類型信息息,C+就是是靠這種種機制來來實現(xiàn)函函數(shù)重載載的。例例如,在在C+中,函函數(shù)vooid fooo( iint x, intt y )與vvoidd fooo( intt x, flloatt y )編譯譯生成的的符號是是不相同同的,后后者為_fooo_innt_ffloaat。同同樣地,CC+中中

45、的變量量除支持持局部變變量外,還還支持類類成員變變量和全全局變量量。用戶戶所編寫寫程序的的類成員員變量可可能與全全局變量量同名,我我們以.來來區(qū)分。而本質(zhì)質(zhì)上,編編譯器在在進行編編譯時,與與函數(shù)的的處理相相似,也也為類中中的變量量取了一一個獨一一無二的的名字,這這個名字字與用戶戶程序中中同名的的全局變變量名字字不同。未加eexteern C聲明時時的連接接方式假設(shè)在CC+中中,模塊塊A的頭頭文件如如下:/ 模模塊A頭頭文件modduleeA.hh#iffndeef MMODUULE_A_HH#deefinne MMODUULE_A_HHintt fooo( intt x, innt yy );

46、#enndiff在在模塊BB中引用用該函數(shù)數(shù):/ 模塊塊B實現(xiàn)現(xiàn)文件modduleeB.ccppi nncluude moodulleA.hffoo(2,33);加extternn CC聲明明后的編編譯和連連接方式式加extternn CC聲明明后,模模塊A的的頭文件件變?yōu)椋? 模塊AA頭文件件moodulleA.h#iifnddef MODDULEE_A_H#ddefiine MODDULEE_A_Hexxterrn C intt fooo( intt x, innt yy );#enndiff在模塊BB的實現(xiàn)現(xiàn)文件中中仍然調(diào)調(diào)用fooo( 2,33 ),其其結(jié)果是是:(11)模塊塊A編譯譯

47、生成ffoo的的目標(biāo)代代碼時,沒沒有對其其名字進進行特殊殊處理,采采用了CC語言的的方式;(2)連連接器在在為模塊塊B的目目標(biāo)代碼碼尋找ffoo(2,33)調(diào)用用時,尋尋找的是是未經(jīng)修修改的符符號名_fooo。如果果在模塊塊A中函函數(shù)聲明明了fooo為eexteern C類型,而而模塊BB中包含含的是eexteern intt fooo( intt x, innt yy ) ,則模模塊B找找不到模模塊A中中的函數(shù)數(shù);反之之亦然。所以,可可以用一一句話概概括exxterrn “CC”這個個聲明的的真實目目的(任任何語言言中的任任何語法法特性的的誕生都都不是隨隨意而為為的,來來源于真真實世界界的需

48、求求驅(qū)動。我們在在思考問問題時,不不能只停停留在這這個語言言是怎么么做的,還還要問一一問它為為什么要要這么做做,動機機是什么么,這樣樣我們可可以更深深入地理理解許多多問題):實現(xiàn)CC+與與C及其其它語言言的混合合編程。明明白了CC+中中extternn CC的設(shè)設(shè)立動機機,我們們下面來來具體分分析exxterrn C通通常的使使用技巧巧:exxterrn C的的慣用法法1)在在C+中引用用C語言言中的函函數(shù)和變變量,在在包含CC語言頭頭文件(假假設(shè)為ccExaamplle.hh)時,需需進行下下列處理理:exxterrn Ci nclludee ccExaamplle.hh而在CC語言的的頭文

49、件件中,對對其外部部函數(shù)只只能指定定為exxterrn類型型,C語語言中不不支持eexteern C聲明,在在.c文文件中包包含了eexteern C時會出出現(xiàn)編譯譯語法錯錯誤。CC+引引用C函函數(shù)例子子工程中中包含的的三個文文件的源源代碼如如下:/* cc語言頭頭文件:cExxampple.h */#iifnddef C_EEXAMMPLEE_H#deffinee C_EXAAMPLLE_HHextternn innt aadd(intt x,intt y);#eendiif/* c語語言實現(xiàn)現(xiàn)文件:cExxampple.c */ii nccludde cExxampple.hiint ad

50、dd( iint x, intt y )retturnn x + yy;/ c+實現(xiàn)文文件,調(diào)調(diào)用addd:ccppFFilee.cpppexxterrn Ci nclludee ccExaamplle.hhintt maain(intt arrgc, chhar* arrgv)addd(2,3);retturnn 0;如果CC+調(diào)調(diào)用一個個C語言言編寫的的.DLLL時,當(dāng)當(dāng)包括.DLLL的頭文文件或聲聲明接口口函數(shù)時時,應(yīng)加加extternn CC 。(2)在在C中引引用C+語言言中的函函數(shù)和變變量時,CC+的的頭文件件需添加加extternn CC,但但是在CC語言中中不能直直接引用用聲明

51、了了extternn CC的該該頭文件件,應(yīng)該該僅將CC文件中中將C+中定定義的eexteern C函數(shù)聲聲明為eexteern類類型。CC引用CC+函函數(shù)例子子工程中中包含的的三個文文件的源源代碼如如下:/C+頭文文件 ccppEExammplee.h#ifnndeff CPPP_EEXAMMPLEE_H#deffinee CPPP_EEXAMMPLEE_Heexteern C innt aadd( innt xx, iint y );#eendiif/C+實現(xiàn)文文件 ccppEExammplee.cpppii nccludde cpppExaamplle.hhinnt aadd( innt

52、 xx, iint y )retturnn x + yy;/* C實現(xiàn)現(xiàn)文件 cFiile.c/* 這樣樣會編譯譯出錯:i nclludee ccExaamplle.hh */int maiin( intt arrgc, chhar* arrgv )addd( 22, 33 );retturnn 0;155題目的的解答請請參考CC+中中extternn “CC”含義義深層探探索注注解:幾道c筆筆試題(含參考考答案)1. Whaat iis ddispplayyed wheen ff() is callledd giivenn thhe ccodee:cllasss Nuumbeer pubbl

53、icc:sttrinng ttypee; NNumbber(): typpe(“voiid”) eexplliciit NNumbber(shoort) : typpe(“shoort”) Nummberr(innt) : ttypee(“intt”) ;vooid Shoow(cconsst NNumbber& n) couut nn.tyype; vvoidd f()shoort s = 422;Shhow(s); a) voiid b) shhortt cc) iint d) Noone of thee abbovee選C;雖然傳傳入的是是shoort類類型,但但是shhortt類型的的

54、構(gòu)造函函數(shù)被生生命被eexplliciit,也也就是只只能顯示示類型轉(zhuǎn)轉(zhuǎn)換,不不能使用用隱式類類型轉(zhuǎn)換換2. Whiich is thee coorreect outtputt foor tthe folllowwingg coodeddoubble dArrrayy2 = 4, 8, *p, *q;p = &ddArrray0;q = p + 1;couut qq p enddl; couut (intt)q - (intt)p enddl;aa) 11 annd 88 b) 8 aand 4 c) 4 aand 8 d) 8 aand 1。第第二個選選A;第第一個是是指針加加減,按按照的是

55、是指向地地址類型型的加減減,只跟跟類型位位置有關(guān)關(guān),q和和p指向向的數(shù)據(jù)據(jù)類型以以實際數(shù)數(shù)據(jù)類型型來算差差一個位位置,因因此是11。而第第二個加加減是實實際指針針值得加加減,在在內(nèi)存中中一個ddoubble類類型占據(jù)據(jù)8個字字節(jié),因因此是8854.SSonyy筆試題題1完成下下列程序序 * *.*. *.*.*. *.*.*.*. *.*.*.*.*. *.*.*.*.*.*. *.*.*.*.*.*.*. *.*.*.*.*.*.*.*. #inncluudeusinng nnameespaace stdd;#deffinee N 8int maiin()intt i,j,kk;forr(i

56、=0;iiN;i+)foor(jj=0;j=i;jj+) couut*; forr(k=0;kki;k+) coout.;cooutenndl;retturnn 0;2完成成程序,實實現(xiàn)對數(shù)數(shù)組的降降序排序序 #inncluude vvoidd soort( ); intt maain() intt arrrayy=455,566,766,2334,11,344,233,2,33; /數(shù)數(shù)字任/意給給出 ssortt( ); rretuurn 0; voiid ssortt( ) _ | | | | |-| 3費波那那其數(shù)列列,1,11,2,33,5編寫寫程序求求第十項項??梢砸杂眠f歸歸,也可

57、可以用其其 他方方法,但但要說明明你選擇擇的理由由。 #inccluddeusinng nnameespaace stdd;int Pheeponnatcch(iint);int maiin()couutThhe 110thh iss Phhepoonattch(10)eendll;retturnn 0;int Pheeponnatcch(iint i)iff(i=1|i=2)reeturrn 11;elssereeturrn PPhepponaatchh(i-1)+Pheeponnatcch(ii-2);4下列列程序運運行時會會崩潰,請請找出錯錯誤并改改正,并并且說明明原因。 #innclu

58、ude#inncluudetyppedeef sstruuct TNNodee* lleftt; TTNodde* rigght; innt vvaluue; TNNodee; TNNodee* rroott=NUULL; voiid aappeend(intt N); innt mmainn() apppennd(663); apppennd(445); apppennd(332); apppennd(777); apppennd(996); apppennd(221); apppennd(117); / Aggainn, 數(shù)數(shù)字任意意給出 voiid aappeend(intt N) TT

59、Nodde* NewwNodde=(TNoode *)mmallloc(sizzeoff(TNNodee); NeewNoode-vaaluee=N; iff(rooot=NUULL) rooot=NNewNNodee; rretuurn; elsse TNNodee* ttempp; ttempp=rooot; whhilee(NN=ttempp.vaaluee & teemp.lefft!=NULLL) | (N !=NNULLL) wwhille(NN=ttempp.vaaluee & teemp.lefft!=NULLL) temmp=ttempp.leeft; whhilee(N t

60、emmp=ttempp.riightt; iff(N=teemp.vallue) teemp.lefft=NNewNNodee; eelsee teemp.rigght=NewwNodde; retturnn; 55請你你分別畫畫出OSSI的七七層網(wǎng)絡(luò)絡(luò)結(jié)構(gòu)圖圖和TCCP/IIP的五五層結(jié)構(gòu)構(gòu)圖。應(yīng)用層:為應(yīng)用用程序提提供服務(wù)務(wù)表示層:處理在在兩個通通信系統(tǒng)統(tǒng)中交換換信息的的表示方方式會話層:負(fù)責(zé)維維護兩個個結(jié)點間間會話連連接的建建立、管管理和終終止,以以及數(shù)據(jù)據(jù)交換傳輸層:向用戶戶提供可可靠的端端到端服服務(wù)。UUDP TCPP協(xié)議。網(wǎng)絡(luò)層:通過路路由選擇擇算法為為分組通通過通信信子網(wǎng)選選擇最

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論