c c++筆試題匯總 軟件工程師學(xué)習(xí)用_第1頁
c c++筆試題匯總 軟件工程師學(xué)習(xí)用_第2頁
c c++筆試題匯總 軟件工程師學(xué)習(xí)用_第3頁
c c++筆試題匯總 軟件工程師學(xué)習(xí)用_第4頁
c c++筆試題匯總 軟件工程師學(xué)習(xí)用_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、*1.求下面函數(shù)的返回值(微軟)int func(x)int couuntx = 0;while(xx)countx +;x = x&(x-1);return counttx; 假定x = 99999。 答案:8思路:將x轉(zhuǎn)化化為2進(jìn)制,看看含有的1的的個數(shù)。2. 什么是“引用”?申明和使使用“引用”要注意哪些些問題?答:引用就是某某個目標(biāo)變量量的“別名”(aliaas),對引引用的操作與與對變量直接接操作效果完完全相同。申申明一個引用用的時候,切切記要對其進(jìn)進(jìn)行初始化。引引用聲明完畢畢后,相當(dāng)于于目標(biāo)變量名名有兩個名稱稱,即該目標(biāo)標(biāo)原名稱和引引用名,不能能再把該引用用名作為其他他變量名的別別

2、名。聲明一一個引用,不不是新定義了了一個變量,它它只表示該引引用名是目標(biāo)標(biāo)變量名的一一個別名,它它本身不是一一種數(shù)據(jù)類型型,因此引用用本身不占存存儲單元,系系統(tǒng)也不給引引用分配存儲儲單元。不能能建立數(shù)組的的引用。!3. 將“引用”作為函數(shù)參參數(shù)有哪些特特點?(1)傳遞引用用給函數(shù)與傳傳遞指針的效效果是一樣的的。這時,被被調(diào)函數(shù)的形形參就成為原原來主調(diào)函數(shù)數(shù)中的實參變變量或?qū)ο蟮牡囊粋€別名來來使用,所以以在被調(diào)函數(shù)數(shù)中對形參變變量的操作就就是對其相應(yīng)應(yīng)的目標(biāo)對象象(在主調(diào)函函數(shù)中)的操操作。(2)使用引用用傳遞函數(shù)的的參數(shù),在內(nèi)內(nèi)存中并沒有有產(chǎn)生實參的的副本,它是是直接對實參參操作;而使使用一般

3、變量量傳遞函數(shù)的的參數(shù),當(dāng)發(fā)發(fā)生函數(shù)調(diào)用用時,需要給給形參分配存存儲單元,形形參變量是實實參變量的副副本;如果傳傳遞的是對象象,還將調(diào)用用拷貝構(gòu)造函函數(shù)。因此,當(dāng)當(dāng)參數(shù)傳遞的的數(shù)據(jù)較大時時,用引用比比用一般變量量傳遞參數(shù)的的效率和所占占空間都好。(3)使用指針針作為函數(shù)的的參數(shù)雖然也也能達(dá)到與使使用引用的效效果,但是,在在被調(diào)函數(shù)中中同樣要給形形參分配存儲儲單元,且需需要重復(fù)使用用*指針變變量名的形形式進(jìn)行運算算,這很容易易產(chǎn)生錯誤且且程序的閱讀讀性較差;另另一方面,在在主調(diào)函數(shù)的的調(diào)用點處,必必須用變量的的地址作為實實參。而引用用更容易使用用,更清晰。4. 在什么時時候需要使用用“常引用”?

4、如果既要利用引引用提高程序序的效率,又又要保護(hù)傳遞遞給函數(shù)的數(shù)數(shù)據(jù)不在函數(shù)數(shù)中被改變,就就應(yīng)使用常引引用。常引用用聲明方式:constt 類型標(biāo)識識符 &引用用名=目標(biāo)變變量名;例1int a ;const iint &rra=a;ra=1; /錯誤a=1; /正確例2string foo( );void baar(strring & s);那么下面的表達(dá)達(dá)式將是非法法的:bar(fooo( );bar(heello wworld);原因在于fooo( )和helloo worlld串都會會產(chǎn)生一個臨臨時對象,而而在C+中中,這些臨時時對象都是cconst類類型的。因此此上面的表達(dá)達(dá)式就是試圖

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

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

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

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

9、1000;賦值操作作符的返回值值必須是一個個左值,以便便可以被繼續(xù)續(xù)賦值。因此此引用成了這這個操作符的的惟一返回值值選擇。例3i ncluude int &puut(intt n);int valls10;int errror=-11;void maain()put(0)=10; /以putt(0)函數(shù)數(shù)值作為左值值,等價于vvals00=10;put(9)=20; /以putt(9)函數(shù)數(shù)值作為左值值,等價于vvals99=20;coutvvals00;cout=0 & n=9 ) retturn vvalsnn;else coutsubbscrippt errror; returrn er

10、rror; (5)在另外的的一些操作符符中,卻千萬萬不能返回引引用:+-*/ 四則運運算符。它們們不能返回引引用,Efffectivve C+1的IItem233詳細(xì)的討論論了這個問題題。主要原因因是這四個操操作符沒有sside eeffectt,因此,它它們必須構(gòu)造造一個對象作作為返回值,可可選的方案包包括:返回一一個對象、返返回一個局部部變量的引用用,返回一個個new分配配的對象的引引用、返回一一個靜態(tài)對象象引用。根據(jù)據(jù)前面提到的的引用作為返返回值的三個個規(guī)則,第22、3兩個方方案都被否決決了。靜態(tài)對對象的引用又又因為(aa+b) = (c+d)會永永遠(yuǎn)為truue而導(dǎo)致錯錯誤。所以可可選

11、的只剩下下返回一個對對象了。!6. “引用”與多態(tài)的關(guān)關(guān)系?引用是除指針外外另一個可以以產(chǎn)生多態(tài)效效果的手段。這這意味著,一一個基類的引引用可以指向向它的派生類類實例。例4Class AA; Claass B : Claass A.; B b; A& rref = b;7. “引用”與指針的區(qū)區(qū)別是什么?指針通過某個指指針變量指向向一個對象后后,對它所指指向的變量間間接操作。程程序中使用指指針,程序的的可讀性差;而引用本身身就是目標(biāo)變變量的別名,對對引用的操作作就是對目標(biāo)標(biāo)變量的操作作。此外,就就是上面提到到的對函數(shù)傳傳ref和ppointeer的區(qū)別。8. 什么時候候需要“引用”?流操作符、

12、賦值值操作符=的的返回值、拷拷貝構(gòu)造函數(shù)數(shù)的參數(shù)、賦賦值操作符=的參數(shù)、其其它情況都推推薦使用引用用。以上 2-8 參考:htttp:/wwfwd/aarchivve/20006/05/30/7663551.aspx9. 結(jié)構(gòu)與聯(lián)聯(lián)合有和區(qū)別別?1. 結(jié)構(gòu)和聯(lián)聯(lián)合都是由多多個不同的數(shù)數(shù)據(jù)類型成員員組成, 但但在任何同一一時刻, 聯(lián)聯(lián)合中只存放放了一個被選選中的成員(所所有成員共用用一塊地址空空間), 而而結(jié)構(gòu)的所有有成員都存在在(不同成員員的存放地址址不同)。 2. 對于聯(lián)合合的不同成員員賦值, 將將會對其它成成員重寫, 原來成員的的值就不存在在了, 而對對于結(jié)構(gòu)的不不同成員賦值值是互不影響響

13、的。10. 下面關(guān)關(guān)于“聯(lián)合”的題目的輸輸出?a)i ncluude unionint i;char x2;a;void maain()a.x0 = 10;a.x1 = 1;printf(%d,a.i);答案:266 (低位低地地址,高位高高地址,內(nèi)存存占用情況是是Ox0100A)b)main()union /*定義一一個聯(lián)合*/int i;struct /*在聯(lián)聯(lián)合中定義一一個結(jié)構(gòu)*/char fiirst;char seecond;half;numberr;number.i=0 x44241; /*聯(lián)合成成員賦值*/printf(%c%ccn, numbeer.hallf.firrst,

14、mmumberr.halff.secoond);number.half.firstt=a; /*聯(lián)合合中結(jié)構(gòu)成員員賦值*/number.half.seconnd=b;printf(%xnn, nuumber.i);getch();答案: AB (0 x411對應(yīng)A,是低位;Ox42對對應(yīng)B,是高位)6261 (nnumberr.i和nuumber.half共共用一塊地址址空間)11. 已知sstrcpyy的函數(shù)原型型:charr *strrcpy(cchar *strDeest, cconst char *strSSrc)其中中strDeest 是目目的字符串,sstrSrcc 是源字符符串。

15、不調(diào)用用C+/CC 的字符串串庫函數(shù),請請編寫函數(shù) strcppy。答案:char *sstrcpyy(charr *strrDest, consst chaar *sttrSrc)if ( sttrDestt = NNULL | strrSrc = NULLL)return NULL ;if ( sttrDestt = sstrSrcc)return strDeest ;char *ttemppttr = sstrDesst ;while( (*strrDest+ = *strSrrc+) != 0);return temppptr ;!122. 已知SStringg類定義如下下:class

16、 SStringgpublic:String(constt charr *strr = NUULL); / 通用用構(gòu)造函數(shù)String(constt Striing &aanotheer); / 拷貝構(gòu)構(gòu)造函數(shù) Strinng(); / 析構(gòu)構(gòu)函數(shù)String & opeeraterr =(coonst SStringg &rhss); / 賦值函數(shù)數(shù)privatee:char *mm_dataa; / 用于保存字字符串;嘗試寫出類的成成員函數(shù)實現(xiàn)現(xiàn)。答案:String:Striing(coonst cchar *str)if ( sttr = NULL ) /sstrlenn在參數(shù)為NNUL

17、L時會會拋異常才會會有這步判斷斷m_data = neww charr1 ;m_data0 = 0 ;elsem_data = neww charrstrllen(sttr) + 1;strcpy(m_datta,strr); String:Striing(coonst SStringg &anoother)m_data = neww charrstrllen(annotherr.m_daata) + 1;strcpy(m_datta,othher.m_data);String& Striing:ooperattor =(constt Striing &rrhs)if ( thhis = &r

18、hss)return *thiss ;delete m_ddata; /刪除原原來的數(shù)據(jù),新新開一塊內(nèi)存存m_data = neww charrstrllen(rhhs.m_ddata) + 1;strcpy(m_datta,rhss.m_daata);return *thiss ;String:Strring()delete m_ddata ;13. .h頭頭文件中的iifndeff/defiine/enndif 的的作用?答:防止該頭文文件被重復(fù)引引用。14. i ncludde 與 i ncludde fiile.h的區(qū)別?答:前者是從SStandaard Liibraryy的路徑尋找找

19、和引用fiile.h,而而后者是從當(dāng)當(dāng)前工作路徑徑搜尋并引用用file.h。15.在C+ 程序中調(diào)調(diào)用被C 編編譯器編譯后后的函數(shù),為為什么要加eexternn “C”?首先,作為exxtern是是C/C+語言中表明明函數(shù)和全局局變量作用范范圍(可見性性)的關(guān)鍵字字,該關(guān)鍵字字告訴編譯器器,其聲明的的函數(shù)和變量量可以在本模模塊或其它模模塊中使用。通常,在模塊的的頭文件中對對本模塊提供供給其它模塊塊引用的函數(shù)數(shù)和全局變量量以關(guān)鍵字eexternn聲明。例如如,如果模塊塊B欲引用該該模塊A中定定義的全局變變量和函數(shù)時時只需包含模模塊A的頭文文件即可。這這樣,模塊BB中調(diào)用模塊塊A中的函數(shù)數(shù)時,在編

20、譯譯階段,模塊塊B雖然找不不到該函數(shù),但但是并不會報報錯;它會在在連接階段中中從模塊A編編譯生成的目目標(biāo)代碼中找找到此函數(shù)extern C是連連接申明(llinkagge decclarattion),被exteern CC修飾的變變量和函數(shù)是是按照C語言言方式編譯和和連接的,來來看看C+中對類似CC的函數(shù)是怎怎樣編譯的:作為一種面向?qū)ο蟮恼Z言,CC+支持函函數(shù)重載,而而過程式語言言C則不支持持。函數(shù)被CC+編譯后后在符號庫中中的名字與CC語言的不同同。例如,假假設(shè)某個函數(shù)數(shù)的原型為:void fooo( innt x, int yy );該函數(shù)被C編譯譯器編譯后在在符號庫中的的名字為_ff

21、oo,而CC+編譯器器則會產(chǎn)生像像_foo_int_iint之類的的名字(不同同的編譯器可可能生成的名名字不同,但但是都采用了了相同的機制制,生成的新新名字稱為“manglled naame”)。_foo_innt_intt 這樣的名名字包含了函函數(shù)名、函數(shù)數(shù)參數(shù)數(shù)量及及類型信息,CC+就是靠靠這種機制來來實現(xiàn)函數(shù)重重載的。例如如,在C+中,函數(shù)vvoid ffoo( iint x, int y )與vvoid ffoo( iint x, floaat y )編譯生成的的符號是不相相同的,后者者為_fooo_int_floatt。同樣地,C+中的變量除除支持局部變變量外,還支支持類成員變變量和

22、全局變變量。用戶所所編寫程序的的類成員變量量可能與全局局變量同名,我我們以.來區(qū)分。而而本質(zhì)上,編編譯器在進(jìn)行行編譯時,與與函數(shù)的處理理相似,也為為類中的變量量取了一個獨獨一無二的名名字,這個名名字與用戶程程序中同名的的全局變量名名字不同。未加exterrn C聲明時的連連接方式假設(shè)在C+中中,模塊A的的頭文件如下下:/ 模塊A頭頭文件mooduleAA.h#ifndeff MODUULE_A_H#definee MODUULE_A_Hint fooo( intt x, iint y );#endif在模塊B中引用用該函數(shù):/ 模塊B實實現(xiàn)文件mmoduleeB.cpppi ncluude m

23、moduleeA.hfoo(2,33);實際上,在連接接階段,連接接器會從模塊塊A生成的目目標(biāo)文件mooduleAA.obj中中尋找_fooo_intt_int這這樣的符號!加externn C聲聲明后的編譯譯和連接方式式加externn C聲聲明后,模塊塊A的頭文件件變?yōu)椋? 模塊A頭頭文件mooduleAA.h#ifndeff MODUULE_A_H#definee MODUULE_A_Hextern C iint fooo( innt x, int yy );#endif在模塊B的實現(xiàn)現(xiàn)文件中仍然然調(diào)用fooo( 2,33 ),其結(jié)結(jié)果是:(1)模塊A編編譯生成fooo的目標(biāo)代代碼時,沒

24、有有對其名字進(jìn)進(jìn)行特殊處理理,采用了CC語言的方式式;(2)連接器在在為模塊B的的目標(biāo)代碼尋尋找foo(2,3)調(diào)調(diào)用時,尋找找的是未經(jīng)修修改的符號名名_foo。如果在模塊A中中函數(shù)聲明了了foo為eexternn C類類型,而模塊塊B中包含的的是exteern innt fooo( intt x, iint y ) ,則模模塊B找不到到模塊A中的的函數(shù);反之之亦然。所以,可以用一一句話概括eexternn “C”這個聲明的的真實目的(任任何語言中的的任何語法特特性的誕生都都不是隨意而而為的,來源源于真實世界界的需求驅(qū)動動。我們在思思考問題時,不不能只停留在在這個語言是是怎么做的,還還要問一問

25、它它為什么要這這么做,動機機是什么,這這樣我們可以以更深入地理理解許多問題題):實現(xiàn)CC+與C及及其它語言的的混合編程。明白了C+中中exterrn C的設(shè)立動機機,我們下面面來具體分析析exterrn C通常的使用用技巧:extern C的慣慣用法(1)在C+中引用C語語言中的函數(shù)數(shù)和變量,在在包含C語言言頭文件(假假設(shè)為cExxamplee.h)時,需需進(jìn)行下列處處理:extern Ci ncluude ccExampple.h而在C語言的頭頭文件中,對對其外部函數(shù)數(shù)只能指定為為exterrn類型,CC語言中不支支持exteern CC聲明,在在.c文件中中包含了exxtern C時會會出

26、現(xiàn)編譯語語法錯誤。C+引用C函函數(shù)例子工程程中包含的三三個文件的源源代碼如下:/* c語言頭頭文件:cEExamplle.h */#ifndeff C_EXXAMPLEE_H#definee C_EXXAMPLEE_Hextern int aadd(innt x,iint y);#endif/* c語言實實現(xiàn)文件:ccExampple.c */i ncluude ccExampple.hint addd( intt x, iint y )return x + yy;/ c+實實現(xiàn)文件,調(diào)調(diào)用add:cppFiile.cpppextern Ci ncluude ccExampple.hint m

27、aiin(intt argcc, chaar* arrgv)add(2,33);return 0;如果C+調(diào)用用一個C語言言編寫的.DDLL時,當(dāng)當(dāng)包括.DLLL的頭文件件或聲明接口口函數(shù)時,應(yīng)應(yīng)加exteern CC 。(2)在C中引引用C+語語言中的函數(shù)數(shù)和變量時,CC+的頭文文件需添加eexternn C,但但是在C語言言中不能直接接引用聲明了了exterrn C的該頭文件件,應(yīng)該僅將將C文件中將將C+中定定義的exttern C函數(shù)聲聲明為exttern類型型。C引用C+函函數(shù)例子工程程中包含的三三個文件的源源代碼如下:/C+頭文文件 cpppExampple.h#ifndeff CP

28、P_EXAMPPLE_H#definee CPP_EXAMPPLE_Hextern C iint addd( innt x, int yy );#endif/C+實現(xiàn)現(xiàn)文件 cpppExammple.ccppi ncluude ccppExaample.hint addd( intt x, iint y )return x + yy;/* C實現(xiàn)文文件 cFiile.c/* 這樣會編編譯出錯:i ncllude cExammple.hh */extern int aadd( iint x, int y );int maiin( innt arggc, chhar* aargv )add( 2,

29、 3 );return 0;15題目的解答答請參考CC+中exxtern “C”含義深層探探索注解:16. 關(guān)聯(lián)、聚聚合(Agggregattion)以以及組合(CCompossitionn)的區(qū)別?涉及到UML中中的一些概念念:關(guān)聯(lián)是表表示兩個類的的一般性聯(lián)系系,比如“學(xué)生”和“老師”就是一種關(guān)關(guān)聯(lián)關(guān)系;聚聚合表示haas-a的關(guān)關(guān)系,是一種種相對松散的的關(guān)系,聚合合類不需要對對被聚合類負(fù)負(fù)責(zé),如下圖圖所示,用空空的菱形表示示聚合關(guān)系:從實現(xiàn)的角度講講,聚合可以以表示為:class AA . claass B A* a; .而組合表示coontainns-a的關(guān)關(guān)系,關(guān)聯(lián)性性強于聚合:組合類

30、與被被組合類有相相同的生命周周期,組合類類要對被組合合類負(fù)責(zé),采采用實心的菱菱形表示組合合關(guān)系:實現(xiàn)的形式是:class AA. classs B A a; .參考文章:htttp:/wwfwd/aarchivve/20006/05/30/7663753.aspxhttp:/wwfwd/aarchivve/20006/05/30/7663760.aspx17.面向?qū)ο笙蟮娜齻€基本本特征,并簡簡單敘述之?1. 封裝:將將客觀事物抽抽象成類,每每個類對自身身的數(shù)據(jù)和方方法實行prrotecttion(pprivatte, prrotectted,puublic)2. 繼承:廣廣義的繼承有有三種實現(xiàn)

31、形形式:實現(xiàn)繼繼承(指使用用基類的屬性性和方法而無無需額外編碼碼的能力)、可可視繼承(子子窗體使用父父窗體的外觀觀和實現(xiàn)代碼碼)、接口繼繼承(僅使用用屬性和方法法,實現(xiàn)滯后后到子類實現(xiàn)現(xiàn))。前兩種種(類繼承)和和后一種(對對象組合=接口繼承以以及純虛函數(shù)數(shù))構(gòu)成了功功能復(fù)用的兩兩種方式。3. 多態(tài):是是將父對象設(shè)設(shè)置成為和一一個或更多的的他的子對象象相等的技術(shù)術(shù),賦值之后后,父對象就就可以根據(jù)當(dāng)當(dāng)前賦值給它它的子對象的的特性以不同同的方式運作作。簡單的說說,就是一句句話:允許將將子類類型的的指針賦值給給父類類型的的指針。18. 重載(ooverlooad)和重重寫(oveerriedd,有的書

32、也也叫做“覆蓋”)的區(qū)別???嫉念}目。從從定義上來說說:重載:是指允許許存在多個同同名函數(shù),而而這些函數(shù)的的參數(shù)表不同同(或許參數(shù)數(shù)個數(shù)不同,或或許參數(shù)類型型不同,或許許兩者都不同同)。重寫:是指子類類重新定義復(fù)復(fù)類虛函數(shù)的的方法。從實現(xiàn)原理上來來說:重載:編譯器根根據(jù)函數(shù)不同同的參數(shù)表,對對同名函數(shù)的的名稱做修飾飾,然后這些些同名函數(shù)就就成了不同的的函數(shù)(至少少對于編譯器器來說是這樣樣的)。如,有有兩個同名函函數(shù):funnctionn funcc(p:inntegerr):intteger;和funcction func(p:strring):integger;。那那么編譯器做做過修飾后的的

33、函數(shù)名稱可可能是這樣的的:int_func、sstr_fuunc。對于于這兩個函數(shù)數(shù)的調(diào)用,在在編譯器間就就已經(jīng)確定了了,是靜態(tài)的的。也就是說說,它們的地地址在編譯期期就綁定了(早早綁定),因因此,重載和和多態(tài)無關(guān)!重寫:和多態(tài)真真正相關(guān)。當(dāng)當(dāng)子類重新定定義了父類的的虛函數(shù)后,父父類指針根據(jù)據(jù)賦給它的不不同的子類指指針,動態(tài)的的調(diào)用屬于子子類的該函數(shù)數(shù),這樣的函函數(shù)調(diào)用在編編譯期間是無無法確定的(調(diào)調(diào)用的子類的的虛函數(shù)的地地址無法給出出)。因此,這這樣的函數(shù)地地址是在運行行期綁定的(晚晚綁定)。19. 多態(tài)的的作用?主要是兩個:11. 隱藏實實現(xiàn)細(xì)節(jié),使使得代碼能夠夠模塊化;擴擴展代碼模塊塊,

34、實現(xiàn)代碼碼重用;2. 接口重用用:為了類在在繼承和派生生的時候,保保證使用家族族中任一類的的實例的某一一屬性時的正正確調(diào)用。20. Adoo與A的相相同與不同?除了“能夠讓應(yīng)應(yīng)用程序處理理存儲于DBBMS 中的的數(shù)據(jù)“這一基本相相似點外,兩兩者沒有太多多共同之處。但但是Ado使使用OLE DB 接口口并基于微軟軟的COM 技術(shù),而AADO.NEET 擁有自自己的ADOO.NET 接口并且基基于微軟的.NET 體體系架構(gòu)。眾眾所周知.NNET 體系系不同于COOM 體系,AADO.NEET 接口也也就完全不同同于ADO和和OLE DDB 接口,這這也就是說AADO.NEET 和ADDO是兩種數(shù)數(shù)

35、據(jù)訪問方式式。ADO.net 提提供對XMLL 的支持。21. Neww deleete 與mmallocc freee 的聯(lián)系與與區(qū)別?答案:都是在堆堆(heapp)上進(jìn)行動動態(tài)的內(nèi)存操操作。用maalloc函函數(shù)需要指定定內(nèi)存分配的的字節(jié)數(shù)并且且不能初始化化對象,neew 會自動動調(diào)用對象的的構(gòu)造函數(shù)。ddeletee 會調(diào)用對對象的desstructtor,而ffree 不不會調(diào)用對象象的desttructoor.22. #deefine DOUBLLE(x) x+x ,ii = 5*DOUBLLE(5); i 是多多少?答案:i 為330。23. 有哪幾幾種情況只能能用intiiali

36、zaation list 而不能用aassignnment?答案:當(dāng)類中含含有consst、refferencce 成員變變量;基類的的構(gòu)造函數(shù)都都需要初始化化表。24. C+是不是類型型安全的?答案:不是。兩兩個不同類型型的指針之間間可以強制轉(zhuǎn)轉(zhuǎn)換(用reeinterrpret cast)。C#是類類型安全的。25. maiin 函數(shù)執(zhí)執(zhí)行以前,還還會執(zhí)行什么么代碼?答案:全局對象象的構(gòu)造函數(shù)數(shù)會在maiin 函數(shù)之之前執(zhí)行。26. 描述內(nèi)內(nèi)存分配方式式以及它們的的區(qū)別?1) 從靜態(tài)存存儲區(qū)域分配配。內(nèi)存在程程序編譯的時時候就已經(jīng)分分配好,這塊塊內(nèi)存在程序序的整個運行行期間都存在在。例如全局

37、局變量,sttatic 變量。2) 在棧上創(chuàng)創(chuàng)建。在執(zhí)行行函數(shù)時,函函數(shù)內(nèi)局部變變量的存儲單單元都可以在在棧上創(chuàng)建,函函數(shù)執(zhí)行結(jié)束束時這些存儲儲單元自動被被釋放。棧內(nèi)內(nèi)存分配運算算內(nèi)置于處理理器的指令集集。3) 從堆上分分配,亦稱動動態(tài)內(nèi)存分配配。程序在運運行的時候用用mallooc 或neew 申請任任意多少的內(nèi)內(nèi)存,程序員員自己負(fù)責(zé)在在何時用frree 或ddeletee 釋放內(nèi)存存。動態(tài)內(nèi)存存的生存期由由程序員決定定,使用非常常靈活,但問問題也最多。27.struuct 和 classs 的區(qū)別答案:struuct 的成成員默認(rèn)是公公有的,而類類的成員默認(rèn)認(rèn)是私有的。sstructt 和

38、 cllass 在在其他方面是是功能相當(dāng)?shù)牡?。從感情上講,大大多數(shù)的開發(fā)發(fā)者感到類和和結(jié)構(gòu)有很大大的差別。感感覺上結(jié)構(gòu)僅僅僅象一堆缺缺乏封裝和功功能的開放的的內(nèi)存位,而而類就象活的的并且可靠的的社會成員,它它有智能服務(wù)務(wù),有牢固的的封裝屏障和和一個良好定定義的接口。既既然大多數(shù)人人都這么認(rèn)為為,那么只有有在你的類有有很少的方法法并且有公有有數(shù)據(jù)(這種種事情在良好好設(shè)計的系統(tǒng)統(tǒng)中是存在的的!)時,你你也許應(yīng)該使使用 strruct 關(guān)關(guān)鍵字,否則則,你應(yīng)該使使用 claass 關(guān)鍵鍵字。 28.當(dāng)一個類類A 中沒有有聲明任何成成員變量與成成員函數(shù),這這時sizeeof(A)的值是多少少,如果不是

39、是零,請解釋釋一下編譯器器為什么沒有有讓它為零。(AAutodeesk)答案:肯定不是是零。舉個反反例,如果是是零的話,聲聲明一個cllass AA10對對象數(shù)組,而而每一個對象象占用的空間間是零,這時時就沒辦法區(qū)區(qū)分A0,A1了。29. 在80086 匯編編下,邏輯地地址和物理地地址是怎樣轉(zhuǎn)轉(zhuǎn)換的?(IIntel)答案:通用寄存存器給出的地地址,是段內(nèi)內(nèi)偏移地址,相相應(yīng)段寄存器器地址*100H+通用寄寄存器內(nèi)地址址,就得到了了真正要訪問問的地址。30. 比較CC+中的44種類型轉(zhuǎn)換換方式?請參考:htttp:/bblog.ccsdn.nnet/wffwd/arrchivee/20066/05

40、/330/7633785.aaspx,重重點是staatic_ccast, dynammic_caast和reeinterrpret_cast的的區(qū)別和應(yīng)用用。31.分別寫出出BOOL,int,ffloat,指針類型的的變量a 與與“零”的比較語句句。答案:BOOL : if ( !a ) or iff(a)int : iif ( aa = 00)float : consst EXPPRESSIION EXXP = 00.0000001if ( a -EXXP)pointerr : iff ( a != NUULL) oor if(a = NULL)32.請說出cconst與與#defiine

41、 相比比,有何優(yōu)點點?答案:1) cconst 常量有數(shù)據(jù)據(jù)類型,而宏宏常量沒有數(shù)數(shù)據(jù)類型。編編譯器可以對對前者進(jìn)行類類型安全檢查查。而對后者者只進(jìn)行字符符替換,沒有有類型安全檢檢查,并且在在字符替換可可能會產(chǎn)生意意料不到的錯錯誤。2) 有些集成成化的調(diào)試工工具可以對cconst 常量進(jìn)行調(diào)調(diào)試,但是不不能對宏常量量進(jìn)行調(diào)試。33.簡述數(shù)組組與指針的區(qū)區(qū)別?數(shù)組要么在靜態(tài)態(tài)存儲區(qū)被創(chuàng)創(chuàng)建(如全局局?jǐn)?shù)組),要要么在棧上被被創(chuàng)建。指針針可以隨時指指向任意類型型的內(nèi)存塊。(1)修改內(nèi)容容上的差別char a = “hhello”;a0 = X;char *pp = “worldd”; / 注意p 指

42、指向常量字符符串p0 = X; / 編譯器不能能發(fā)現(xiàn)該錯誤誤,運行時錯錯誤(2) 用運算算符sizeeof 可以以計算出數(shù)組組的容量(字字節(jié)數(shù))。ssizeoff(p),pp 為指針得得到的是一個個指針變量的的字節(jié)數(shù),而而不是p 所所指的內(nèi)存容容量。C+/C 語言言沒有辦法知知道指針?biāo)钢傅膬?nèi)存容量量,除非在申申請內(nèi)存時記記住它。注意意當(dāng)數(shù)組作為為函數(shù)的參數(shù)數(shù)進(jìn)行傳遞時時,該數(shù)組自自動退化為同同類型的指針針。char a = helloo worlld;char *pp = a;cout sizeoof(a) enndl; / 12 字節(jié)cout sizeoof(p) enndl; / 4 字

43、字節(jié)計算數(shù)組和指針針的內(nèi)存容量量void Fuunc(chhar a100)cout sizeoof(a) enndl; / 4 字字節(jié)而不是1100 字節(jié)節(jié)34.類成員函函數(shù)的重載、覆覆蓋和隱藏區(qū)區(qū)別?答案:a.成員函數(shù)被被重載的特征征:(1)相同的范范圍(在同一一個類中);(2)函數(shù)名字字相同;(3)參數(shù)不同同;(4)virttual 關(guān)關(guān)鍵字可有可可無。b.覆蓋是指派派生類函數(shù)覆覆蓋基類函數(shù)數(shù),特征是:(1)不同的范范圍(分別位位于派生類與與基類);(2)函數(shù)名字字相同;(3)參數(shù)相同同;(4)基類函數(shù)數(shù)必須有viirtuall 關(guān)鍵字。c.“隱藏”是是指派生類的的函數(shù)屏蔽了了與其同名的

44、的基類函數(shù),規(guī)規(guī)則如下:(1)如果派生生類的函數(shù)與與基類的函數(shù)數(shù)同名,但是是參數(shù)不同。此此時,不論有有無virttual關(guān)鍵鍵字,基類的的函數(shù)將被隱隱藏(注意別別與重載混淆淆)。(2)如果派生生類的函數(shù)與與基類的函數(shù)數(shù)同名,并且且參數(shù)也相同同,但是基類類函數(shù)沒有vvirtuaal 關(guān)鍵字字。此時,基基類的函數(shù)被被隱藏(注意意別與覆蓋混混淆)35. Theere arre twoo int variaables: a annd b, dontt use “if”, “? :”, “sswitchh”or oother judgeement stateementss, finnd outt the

45、 biggeest onne of the ttwo nuumberss.答案:( ( a + bb ) + abs( a - bb ) ) / 236. 如何打打印出當(dāng)前源源文件的文件件名以及源文文件的當(dāng)前行行號?答案:cout _FIILE_ ;cout_LINEE_ ;_FILE_和_LLINE_是系統(tǒng)預(yù)定定義宏,這種種宏并不是在在某個文件中中定義的,而而是由編譯器器定義的。37. maiin 主函數(shù)數(shù)執(zhí)行完畢后后,是否可能能會再執(zhí)行一一段代碼,給給出說明?答案:可以,可可以用_onnexit 注冊一個函函數(shù),它會在在main 之后執(zhí)行iint fnn1(voiid), ffn2(voo

46、id), fn3(vvoid), fn4 (voidd);void maain( vvoid )String str(zhangglin);_onexitt( fn11 );_onexitt( fn22 );_onexitt( fn33 );_onexitt( fn44 );printf( Thiis is execuuted ffirst.n );int fn11()printf( nexxt.n );return 0;int fn22()printf( exeecutedd );return 0;int fn33()printf( is );return 0;int fn44()print

47、f( Thiis );return 0;The _onnexit functtion iis passsed tthe adddresss of aa funcction (funcc) to be caalled when the pprograam terrminattes noormallly. Suuccesssive ccalls to _oonexitt creaate a regisster oof funnctionns thaat aree execcuted in LIIFO (llast-iin-firrst-ouut) orrder. The ffunctiions p

48、passedd to _onexiit cannnot ttake pparameeters.38. 如何判判斷一段程序序是由C 編編譯程序還是是由C+編編譯程序編譯譯的?答案:#ifdef _cplluspluuscoutc+;#elsecoutc;#endif39.文件中有有一組整數(shù),要要求排序后輸輸出到另一個個文件中答案:i ncluudei ncluudeusing nnamesppace sstd;void Orrder(vvectorr& datta) /bubblle sorrtint couunt = data.size() ;int tagg = faalse ; / 設(shè)設(shè)置

49、是否需要要繼續(xù)冒泡的的標(biāo)志位for ( iint i = 0 ; i countt ; i+)for ( iint j = 0 ; j daataj+1)tag = ttrue ;int temmp = ddatajj ;dataj = daataj+1 ;dataj+1 = temp ;if ( !ttag )break ;void maain( vvoid )vectorddata;ifstreaam in(c:data.txt);if ( !iin)couttemmp;data.puush_baack(teemp);in.closse(); /關(guān)閉輸輸入文件流Order(ddata);o

50、fstreaam outt(c:resuult.txxt);if ( !oout)coutfile errorr!;exit(1);for ( ii = 0 ; i dataa.sizee() ; i+)outdaatainext = NUULL )return head;Node *pp1 = hhead ;Node *pp2 = pp1-neext ;Node *pp3 = pp2-neext ;p1-nexxt = NNULL ;while ( p3 != NULLL )p2-nexxt = pp1 ;p1 = p22 ;p2 = p33 ;p3 = p33-nexxt ;p2-nexx

51、t = pp1 ;head = p2 ;return head ;(2)已知兩個個鏈表heaad1 和hhead2 各自有序,請請把它們合并并成一個鏈表表依然有序。(保留所有結(jié)結(jié)點,即便大大小相同)Node * Mergee(Nodee *heaad1 , Node *headd2)if ( heead1 = NULLL)return head22 ;if ( heead2 = NULLL)return head11 ;Node *hhead = NULLL ;Node *pp1 = NNULL;Node *pp2 = NNULL;if ( heead1-data ddata )head =

52、head11 ;p1 = heead1-next;p2 = heead2 ;elsehead = head22 ;p2 = heead2-next ;p1 = heead1 ;Node *ppcurreent = head ;while ( p1 != NULLL & p2 != NULLL)if ( p11-datta ddata )pcurrennt-neext = p1 ;pcurrennt = pp1 ;p1 = p11-nexxt ;elsepcurrennt-neext = p2 ;pcurrennt = pp2 ;p2 = p22-nexxt ;if ( p11 != NNULL

53、 )pcurrennt-neext = p1 ;if ( p22 != NNULL )pcurrennt-neext = p2 ;return head ;(3)已知兩個個鏈表heaad1 和hhead2 各自有序,請請把它們合并并成一個鏈表表依然有序,這這次要求用遞遞歸方法進(jìn)行行。 (Auutodessk)答案:Node * MergeeRecurrsive(Node *headd1 , NNode *head22)if ( heead1 = NULLL )return head22 ;if ( heead2 = NULLL)return head11 ;Node *hhead = NULL

54、L ;if ( heead1-data ddata )head = head11 ;head-nnext = MerggeRecuursivee(headd1-neext,heead2);elsehead = head22 ;head-nnext = MerggeRecuursivee(headd1,heaad2-nnext);return head ;41. 分析一一下這段程序序的輸出 (Autoddesk)class BBpublic:B()coutdefauult coonstruuctorenddl;B()coutdestrructedd iinstannce off B)coutco

55、nsttructeed by parammeter data enddl;privatee:int datta;B Play( B b)return b ;(1) ressults:int maiin(intt argcc, chaar* arrgv) consstructted byy paraameterr 5 destrructedd B(5)形參析構(gòu)B t1 = Play(5); BB t2 = Playy(t1); deestruccted tt1形參析構(gòu)構(gòu)return 0; desstructted t22注意順序序! destrructedd t1(2) ressults:int

56、 maiin(intt argcc, chaar* arrgv) consstructted byy paraameterr 5 destrructedd B(5)形參析構(gòu)B t1 = Play(5); BB t2 = Playy(10); coonstruucted by paarametter 100return 0; desstructted B(10)形參參析構(gòu) destrructedd t2注注意順序!destruccted tt142. 寫一個個函數(shù)找出一一個整數(shù)數(shù)組組中,第二大大的數(shù) (mmicrossoft)答案:const iint MIINNUMBBER = -327667

57、 ;int finnd_secc_max( int data , iint coount)int maxxnumbeer = ddata00 ;int secc_max = MINNNUMBEER ;for ( iint i = 1 ; i maaxnumbber )sec_maxx = maaxnumbber ;maxnumbber = datai ;elseif ( daatai seec_maxx )sec_maxx = daatai ;return sec_mmax ;43. 寫一個個在一個字符符串(n)中中尋找一個子子串(m)第第一個位置的的函數(shù)。KMP算法效率率最好,時間間復(fù)雜度是

58、(n+m)。44. 多重繼繼承的內(nèi)存分分配問題:比如有classs A : publlic cllass BB, pubblic cclass C 那么A的內(nèi)存結(jié)結(jié)構(gòu)大致是怎怎么樣的?這個是comppiler-depenndent的的, 不同的的實現(xiàn)其細(xì)節(jié)節(jié)可能不同。如果不考慮有虛虛函數(shù)、虛繼繼承的話就相相當(dāng)簡單;否否則的話,相相當(dāng)復(fù)雜??梢詤⒖忌钊肴胩剿鰿+對象模型,或或者:http:/wwfwd/aarchivve/20006/05/30/7663797.aspx45. 如何判判斷一個單鏈鏈表是有環(huán)的的?(注意不不能用標(biāo)志位位,最多只能能用兩個額外外指針)struct node chaar

59、 vall; nodde* neext;bool chheck(cconst node* headd) /retturn ffalse : 無環(huán);true: 有環(huán)一種O(n)的的辦法就是(搞搞兩個指針,一一個每次遞增增一步,一個個每次遞增兩兩步,如果有有環(huán)的話兩者者必然重合,反反之亦然):bool chheck(cconst node* headd)if(headd=NULLL) reeturn falsee;node *llow=heead, *fast=head-nextt;while(ffast!=NULL & faast-nnext!=NULL)low=loww-nexxt;fast=

60、faast-nnext-next;if(low=fastt) retturn ttrue;return falsee;1、一個學(xué)生的的信息是:姓姓名,學(xué)號,性性別,年齡等等信息,用一一個鏈表,把把這些學(xué)生信信息連在一起起, 給出一一個age, 在些鏈表表中刪除學(xué)生生年齡等于aage的學(xué)生生信息。程序代碼i ncluude sstdio.hi ncluude cconio.hstruct stuchar naame200;char seex;int no;int agee;struct stu * nextt;*linkllist;struct stu *creattlist(int nn)in

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論