c c++筆試題匯總 軟件工程師學習用_第1頁
c c++筆試題匯總 軟件工程師學習用_第2頁
c c++筆試題匯總 軟件工程師學習用_第3頁
c c++筆試題匯總 軟件工程師學習用_第4頁
c c++筆試題匯總 軟件工程師學習用_第5頁
已閱讀5頁,還剩29頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、該該引用名作作為其他變變量名的別別名。聲明明一個引用用,不是新新定義了一一個變量,它它只表示該該引用名是是目標變量量名的一個個別名,它它本身不是是一種數據據類型,因因此引用本本身不占存存儲單元,系系統也不給給引用分配配存儲單元元。不能建建立數組的的引用。!33. 將“引用”作為函數數參數有哪哪些特點?(1)傳遞遞引用給函函數與傳遞遞指針的效效果是一樣樣的。這時時,被調函函數的形參參就成為原原來主調函函數中的實實參變量或或對象的一一個別名來來使用,所所以在被調調函數中對對形參變量量的操作就就是對其相相應的目標標對象(在在主調函數數中)的操操作。(2)使用用引用傳遞遞函數的參參數,在內內存中并沒沒

3、有產生實實參的副本本,它是直直接對實參參操作;而而使用一般般變量傳遞遞函數的參參數,當發發生函數調調用時,需需要給形參參分配存儲儲單元,形形參變量是是實參變量量的副本;如果傳遞遞的是對象象,還將調調用拷貝構構造函數。因此,當當參數傳遞遞的數據較較大時,用用引用比用用一般變量量傳遞參數數的效率和和所占空間間都好。(3)使用用指針作為為函數的參參數雖然也也能達到與與使用引用用的效果,但但是,在被被調函數中中同樣要給給形參分配配存儲單元元,且需要要重復使用用*指針針變量名的形式進進行運算,這這很容易產產生錯誤且且程序的閱閱讀性較差差;另一方方面,在主主調函數的的調用點處處,必須用用變量的地地址作為實

4、實參。而引引用更容易易使用,更更清晰。4. 在什什么時候需需要使用“常引用”?如果既要利利用引用提提高程序的的效率,又又要保護傳傳遞給函數數的數據不不在函數中中被改變,就就應使用常常引用。常常引用聲明明方式:cconstt 類型標標識符 &引用名=目標變量量名;例1int aa ;constt intt &raa=a;ra=1; /錯錯誤a=1; /正確確例2strinng fooo( );void bar(striing & s);那么下面的的表達式將將是非法的的:bar(ffoo( );bar(helllo woorld);原因在于ffoo( )和hhelloo worrld串串都會產生生

5、一個臨時時對象,而而在C+中,這些些臨時對象象都是coonst類類型的。因因此上面的的表達式就就是試圖將將一個coonst類類型的對象象轉換為非非consst類型,這這是非法的的。引用型參數數應該在能能被定義為為consst的情況況下,盡量量定義為cconstt 。!55. 將“引用”作為函數數返回值類類型的格式式、好處和和需要遵守守的規則?格式:類型型標識符 &函數名名(形參列列表及類型型說明) /函函數體 好處:在內內存中不產產生被返回回值的副本本;(注意意:正是因因為這點原原因,所以以返回一個個局部變量量的引用是是不可取的的。因為隨隨著該局部部變量生存存期的結束束,相應的的引用也會會失效

6、,產產生runntimee errror!注意事項:(1)不能能返回局部部變量的引引用。這條條可以參照照Effeectivve C+1的Iteem 311。主要原原因是局部部變量會在在函數返回回后被銷毀毀,因此被被返回的引引用就成為為了無所所指的引引用,程序序會進入未未知狀態。(2)不能能返回函數數內部neew分配的的內存的引引用。這條條可以參照照Effeectivve C+1的Iteem 311。雖然不不存在局部部變量的被被動銷毀問問題,可對對于這種情情況(返回回函數內部部new分分配內存的的引用),又又面臨其它它尷尬局面面。例如,被被函數返回回的引用只只是作為一一個臨時變變量出現,而而沒有

7、被賦賦予一個實實際的變量量,那么這這個引用所所指向的空空間(由nnew分配配)就無法法釋放,造造成memmory leakk。(3)可以以返回類成成員的引用用,但最好好是connst。這這條原則可可以參照EEffecctivee C+1的的Itemm 30。主要原因因是當對象象的屬性是是與某種業業務規則(bbusinness rulee)相關聯聯的時候,其其賦值常常常與某些其其它屬性或或者對象的的狀態有關關,因此有有必要將賦賦值操作封封裝在一個個業務規則則當中。如如果其它對對象可以獲獲得該屬性性的非常量量引用(或或指針),那那么對該屬屬性的單純純賦值就會會破壞業務務規則的完完整性。(4)流操操

8、作符重載載返回值申申明為“引用”的作用:流操作符,這兩個個操作符常常常希望被被連續使用用,例如:coutt helllo eendl;因此這這兩個操作作符的返回回值應該是是一個仍然然支持這兩兩個操作符符的流引用用。可選的的其它方案案包括:返返回一個流流對象和返返回一個流流對象指針針。但是對對于返回一一個流對象象,程序必必須重新(拷拷貝)構造造一個新的的流對象,也也就是說,連連續的兩個個操作作符實際上上是針對不不同對象的的!這無法法讓人接受受。對于返返回一個流流指針則不不能連續使使用操操作符。因因此,返回回一個流對對象引用是是惟一選擇擇。這個唯唯一選擇很很關鍵,它它說明了引引用的重要要性以及無無

9、可替代性性,也許這這就是C+語言中中引入引用用這個概念念的原因吧吧。賦值操操作符=。這個操作作符象流操操作符一樣樣,是可以以連續使用用的,例如如:x = j = 10;或者(xx=10)=1000;賦值操操作符的返返回值必須須是一個左左值,以便便可以被繼繼續賦值。因此引用用成了這個個操作符的的惟一返回回值選擇。例3i nccludee int &put(int n);int vvals10;int eerrorr=-1;void mainn()put(00)=100; /以putt(0)函函數值作為為左值,等等價于vaals00=100;put(99)=200; /以putt(9)函函數值作為

10、為左值,等等價于vaals99=200;coutvalls0;cout=0 & nn=9 ) reeturnn vallsn;else cooutsubbscriipt eerrorr; rreturrn errror; (5)在另另外的一些些操作符中中,卻千萬萬不能返回回引用:+-*/ 四則運算算符。它們們不能返回回引用,EEffecctivee C+1的的Itemm23詳細細的討論了了這個問題題。主要原原因是這四四個操作符符沒有siide eeffecct,因此此,它們必必須構造一一個對象作作為返回值值,可選的的方案包括括:返回一一個對象、返回一個個局部變量量的引用,返返回一個nnew分配

11、配的對象的的引用、返返回一個靜靜態對象引引用。根據據前面提到到的引用作作為返回值值的三個規規則,第22、3兩個個方案都被被否決了。靜態對象象的引用又又因為(a+b) = (c+dd)會永永遠為trrue而導導致錯誤。所以可選選的只剩下下返回一個個對象了。!66. “引用”與多態的的關系?引用是除指指針外另一一個可以產產生多態效效果的手段段。這意味味著,一個個基類的引引用可以指指向它的派派生類實例例。例4Classs A; Classs B : Cllass A.; B b; A& ref = b;7. “引引用”與指針的的區別是什什么?指針通過某某個指針變變量指向一一個對象后后,對它所所指向的

12、變變量間接操操作。程序序中使用指指針,程序序的可讀性性差;而引引用本身就就是目標變變量的別名名,對引用用的操作就就是對目標標變量的操操作。此外外,就是上上面提到的的對函數傳傳ref和和poinnter的的區別。8. 什么么時候需要要“引用”?流操作符、賦值操操作符=的的返回值、拷貝構造造函數的參參數、賦值值操作符=的參數、其它情況況都推薦使使用引用。以上 2-8 參考考:htttp:/blogg.csddn.neet/wffwd/aarchiive/22006/05/330/76635511.asppx9. 結構構與聯合有有和區別?1. 結構構和聯合都都是由多個個不同的數數據類型成成員組成,

13、但在任任何同一時時刻, 聯聯合中只存存放了一個個被選中的的成員(所所有成員共共用一塊地地址空間), 而結構構的所有成成員都存在在(不同成成員的存放放地址不同同)。 2. 對于于聯合的不不同成員賦賦值, 將將會對其它它成員重寫寫, 原來來成員的值值就不存在在了, 而而對于結構構的不同成成員賦值是是互不影響響的。10. 下下面關于“聯合”的題目的的輸出?a)i nccludee unionnint ii;char x2;a;void mainn()a.x00 = 10;a.x11 = 1;printtf(%d,aa.i);答案:2666 (低低位低地址址,高位高高地址,內內存占用情情況是Oxx01

14、0AA)b)main()unionn /*定義一個個聯合*/int ii;strucct /*在聯合合中定義一一個結構*/char firsst;char secoond;halff;numbber;numbeer.i=0 x42241; /*聯合合成員賦值值*/printtf(%c%cn, numbber.hhalf.firsst, mmumbeer.haalf.sseconnd);numbeer.haalf.ffirstt=a; /*聯合中結結構成員賦賦值*/numbeer.haalf.sseconnd=bb;printtf(%xn, nuumberr.i);getchh();答案: AA

15、B (00 x41對對應A,是低位位;Ox442對應B,是是高位)6261 (nummber.i和nuumberr.hallf共用一一塊地址空空間)11. 已已知strrcpy的的函數原型型:chaar *sstrcppy(chhar *strDDest, connst cchar *strrSrc)其中sttrDesst 是目目的字符串串,strrSrc 是源字符符串。不調調用C+/C 的的字符串庫庫函數,請請編寫函數數 strrcpy。答案:char *strrcpy(charr *sttrDesst, cconstt chaar *sstrSrrc)if ( strDDest = NNU

16、LL | sstrSrrc = NULLL)returrn NUULL ;if ( strDDest = sstrSrrc)returrn sttrDesst ;char *temmpptrr = sstrDeest ;whilee( (*strDDest+ = *strrSrc+) != 0);returrn teemppttr ;!112. 已已知Strring類類定義如下下:classs Strringpubliic:Strinng(coonst charr *sttr = NULLL); / 通用用構造函數數Strinng(coonst Striing &anotther); / 拷貝

17、構構造函數 Strring(); / 析構構函數Strinng & operraterr =(cconstt Strring &rhss); / 賦值值函數privaate:char *m_ddata; / 用于保存存字符串;嘗試寫出類類的成員函函數實現。答案:Strinng:SStrinng(coonst charr *sttr)if ( str = NNULL ) /strllen在參參數為NUULL時會會拋異常才才會有這步步判斷m_datta = new charr1 ;m_datta0 = 0 ;elsem_datta = new charrstrrlen(str) + 11;strc

18、ppy(m_dataa,strr); Strinng:SStrinng(coonst Striing &anotther)m_datta = new charrstrrlen(anotther.m_daata) + 1;strcppy(m_dataa,othher.mm_datta);Strinng& SStrinng:ooperaator =(coonst Striing &rhs)if ( thiss = &rhss)returrn *tthis ;delette m_daata; /刪除除原來的數數據,新開開一塊內存存m_datta = new charrstrrlen(rhs.m_da

19、ata) + 1;strcppy(m_dataa,rhss.m_ddata);returrn *tthis ;Strinng:Striing()delette m_daata ;13. .h頭文件件中的iffndeff/deffine/endiif 的作作用?答:防止該該頭文件被被重復引用用。14. i nccludee 與 i nccludee fiile.hh的區別別?答:前者是是從Staandarrd Liibrarry的路徑徑尋找和引引用fille.h,而而后者是從從當前工作作路徑搜尋尋并引用ffile.h。15.在CC+ 程程序中調用用被C 編編譯器編譯譯后的函數數,為什么么要加ex

20、xternn “C”?首先,作為為exteern是CC/C+語言中表表明函數和和全局變量量作用范圍圍(可見性性)的關鍵鍵字,該關關鍵字告訴訴編譯器,其其聲明的函函數和變量量可以在本本模塊或其其它模塊中中使用。通常,在模模塊的頭文文件中對本本模塊提供供給其它模模塊引用的的函數和全全局變量以以關鍵字eexterrn聲明。例如,如如果模塊BB欲引用該該模塊A中中定義的全全局變量和和函數時只只需包含模模塊A的頭頭文件即可可。這樣,模模塊B中調調用模塊AA中的函數數時,在編編譯階段,模模塊B雖然然找不到該該函數,但但是并不會會報錯;它它會在連接接階段中從從模塊A編編譯生成的的目標代碼碼中找到此此函數ex

21、terrn CC是連接接申明(llinkaage ddeclaaratiion),被exttern C修修飾的變量量和函數是是按照C語語言方式編編譯和連接接的,來看看看C+中對類似似C的函數數是怎樣編編譯的:作為一種面面向對象的的語言,CC+支持持函數重載載,而過程程式語言CC則不支持持。函數被被C+編編譯后在符符號庫中的的名字與CC語言的不不同。例如如,假設某某個函數的的原型為:void foo( intt x, int y );該函數被CC編譯器編編譯后在符符號庫中的的名字為_foo,而而C+編編譯器則會會產生像_foo_int_int之之類的名字字(不同的的編譯器可可能生成的的名字不同同

22、,但是都都采用了相相同的機制制,生成的的新名字稱稱為“manggled namee”)。_foo_int_int 這樣的名名字包含了了函數名、函數參數數數量及類類型信息,CC+就是是靠這種機機制來實現現函數重載載的。例如如,在C+中,函函數voiid fooo( iint xx, innt y )與vooid ffoo( int x, ffloatt y )編譯生成成的符號是是不相同的的,后者為為_fooo_intt_flooat。同樣地,CC+中的的變量除支支持局部變變量外,還還支持類成成員變量和和全局變量量。用戶所所編寫程序序的類成員員變量可能能與全局變變量同名,我我們以.來區分分。而本質

23、質上,編譯譯器在進行行編譯時,與與函數的處處理相似,也也為類中的的變量取了了一個獨一一無二的名名字,這個個名字與用用戶程序中中同名的全全局變量名名字不同。未加exttern C聲聲明時的連連接方式假設在C+中,模模塊A的頭頭文件如下下:/ 模塊塊A頭文件件modduleAA.h#ifnddef MMODULLE_A_H#defiine MMODULLE_A_Hint ffoo( int x, iint yy );#endiif在模塊B中中引用該函函數:/ 模塊塊B實現文文件mooduleeB.cpppi nccludee mooduleeA.hfoo(22,3);實際上,在在連接階段段,連接器

24、器會從模塊塊A生成的的目標文件件moduuleA.obj中中尋找_ffoo_iint_iint這樣樣的符號!加exteern C聲明明后的編譯譯和連接方方式加exteern C聲明明后,模塊塊A的頭文文件變為:/ 模塊塊A頭文件件modduleAA.h#ifnddef MMODULLE_A_H#defiine MMODULLE_A_Hexterrn CC innt fooo( iint xx, innt y );#endiif在模塊B的的實現文件件中仍然調調用fooo( 2,3 ),其其結果是:(1)模塊塊A編譯生生成fooo的目標代代碼時,沒沒有對其名名字進行特特殊處理,采采用了C語語言的方

25、式式;(2)連接接器在為模模塊B的目目標代碼尋尋找fooo(2,33)調用時時,尋找的的是未經修修改的符號號名_fooo。如果在模塊塊A中函數數聲明了ffoo為eexterrn CC類型,而而模塊B中中包含的是是exteern iint ffoo( int x, iint yy ) ,則則模塊B找找不到模塊塊A中的函函數;反之之亦然。所以,可以以用一句話話概括exxternn “C”這個聲明明的真實目目的(任何何語言中的的任何語法法特性的誕誕生都不是是隨意而為為的,來源源于真實世世界的需求求驅動。我我們在思考考問題時,不不能只停留留在這個語語言是怎么么做的,還還要問一問問它為什么么要這么做做,

26、動機是是什么,這這樣我們可可以更深入入地理解許許多問題):實現C+與C及及其它語言言的混合編編程。明白了C+中exxternn C的設立動動機,我們們下面來具具體分析eexterrn CC通常的的使用技巧巧:exterrn CC的慣用用法(1)在CC+中引引用C語言言中的函數數和變量,在在包含C語語言頭文件件(假設為為cExaamplee.h)時時,需進行行下列處理理:exterrn CCi nccludee cEExampple.hh而在C語言言的頭文件件中,對其其外部函數數只能指定定為exttern類類型,C語語言中不支支持exttern C聲聲明,在.c文件中中包含了eexterrn C

27、C時會出出現編譯語語法錯誤。C+引用用C函數例例子工程中中包含的三三個文件的的源代碼如如下:/* c語語言頭文件件:cExxamplle.h */#ifnddef CC_EXAAMPLEE_H#defiine CC_EXAAMPLEE_Hexterrn innt addd(innt x,int y);#endiif/* c語語言實現文文件:cEExampple.cc */i nccludee cEExampple.hhint aadd( int x, iint yy )returrn x + y;/ c+實現文文件,調用用add:cppFFile.cppexterrn CCi nccludee

28、 cEExampple.hhint mmain(int argcc, chhar* argvv)add(22,3);returrn 0;如果C+調用一個個C語言編編寫的.DDLL時,當當包括.DDLL的頭頭文件或聲聲明接口函函數時,應應加exttern C 。(2)在CC中引用CC+語言言中的函數數和變量時時,C+的頭文件件需添加eexterrn CC,但是是在C語言言中不能直直接引用聲聲明了exxternn C的該頭文文件,應該該僅將C文文件中將CC+中定定義的exxternn C函數聲明明為exttern類類型。C引用C+函數例例子工程中中包含的三三個文件的的源代碼如如下:/C+頭文件 c

29、ppEExampple.hh#ifnddef CCPP_EEXAMPPLE_HH#defiine CCPP_EEXAMPPLE_HHexterrn CC innt addd( iint xx, innt y );#endiif/C+實現文件件 cpppExammple.cppi nccludee cpppExaamplee.hint aadd( int x, iint yy )returrn x + y;/* C實實現文件 cFille.c/* 這樣樣會編譯出出錯:ii ncllude cExxamplle.h */exterrn innt addd( iint xx, innt y );in

30、t mmain( intt arggc, cchar* arggv )add( 2, 33 );returrn 0;15題目的的解答請參參考C+中exxternn “C”含義深層層探索注注解:16. 關關聯、聚合合(Agggregaationn)以及組組合(Coompossitioon)的區區別?涉及到UMML中的一一些概念:關聯是表表示兩個類類的一般性性聯系,比比如“學生”和“老師”就是一種種關聯關系系;聚合表表示hass-a的關關系,是一一種相對松松散的關系系,聚合類類不需要對對被聚合類類負責,如如下圖所示示,用空的的菱形表示示聚合關系系:從實現的角角度講,聚聚合可以表表示為:classs

31、 A . claass BB AA* a; .而組合表示示conttainss-a的關關系,關聯聯性強于聚聚合:組合合類與被組組合類有相相同的生命命周期,組組合類要對對被組合類類負責,采采用實心的的菱形表示示組合關系系:實現的形式式是:classs A. classs B A aa; .參考文章:httpp:/t/wfwwd/arrchivve/20006/005/300/7633753.aspxxhttp:/wfwdd/arcchivee/20006/055/30/7637760.aaspx17.面向向對象的三三個基本特特征,并簡簡單敘述之之?1. 封裝裝:將客觀觀事物抽象象成類,每每個類對

32、自自身的數據據和方法實實行prootecttion(privvate, prootectted,ppubliic)2. 繼承承:廣義的的繼承有三三種實現形形式:實現現繼承(指指使用基類類的屬性和和方法而無無需額外編編碼的能力力)、可視視繼承(子子窗體使用用父窗體的的外觀和實實現代碼)、接口繼承承(僅使用用屬性和方方法,實現現滯后到子子類實現)。前兩種(類類繼承)和和后一種(對對象組合=接口繼繼承以及純純虛函數)構構成了功能能復用的兩兩種方式。3. 多態態:是將父父對象設置置成為和一一個或更多多的他的子子對象相等等的技術,賦賦值之后,父父對象就可可以根據當當前賦值給給它的子對對象的特性性以不同的

33、的方式運作作。簡單的的說,就是是一句話:允許將子子類類型的的指針賦值值給父類類類型的指針針。18. 重重載(ovverlooad)和和重寫(ooverrried,有有的書也叫叫做“覆蓋”)的區別別?常考的題目目。從定義義上來說:重載:是指指允許存在在多個同名名函數,而而這些函數數的參數表表不同(或或許參數個個數不同,或或許參數類類型不同,或或許兩者都都不同)。重寫:是指指子類重新新定義復類類虛函數的的方法。從實現原理理上來說:重載:編譯譯器根據函函數不同的的參數表,對對同名函數數的名稱做做修飾,然然后這些同同名函數就就成了不同同的函數(至至少對于編編譯器來說說是這樣的的)。如,有有兩個同名名函

34、數:ffuncttion funcc(p:iintegger):inteeger;和funnctioon fuunc(pp:strring):inttegerr;。那么么編譯器做做過修飾后后的函數名名稱可能是是這樣的:int_funcc、strr_funnc。對于于這兩個函函數的調用用,在編譯譯器間就已已經確定了了,是靜態態的。也就就是說,它它們的地址址在編譯期期就綁定了了(早綁定定),因此此,重載和和多態無關關!重寫:和多多態真正相相關。當子子類重新定定義了父類類的虛函數數后,父類類指針根據據賦給它的的不同的子子類指針,動動態的調用用屬于子類類的該函數數,這樣的的函數調用用在編譯期期間是無法

35、法確定的(調調用的子類類的虛函數數的地址無無法給出)。因此,這這樣的函數數地址是在在運行期綁綁定的(晚晚綁定)。19. 多多態的作用用?主要是兩個個:1. 隱藏實現現細節,使使得代碼能能夠模塊化化;擴展代代碼模塊,實實現代碼重重用;2. 接口重重用:為了了類在繼承承和派生的的時候,保保證使用家家族中任一一類的實例例的某一屬屬性時的正正確調用。20. AAdo與AAdo.nnet的相相同與不同同?除了“能夠夠讓應用程程序處理存存儲于DBBMS 中中的數據“這一基本本相似點外外,兩者沒沒有太多共共同之處。但是Addo使用OOLE DDB 接口口并基于微微軟的COOM 技術術,而ADDO.NEET

36、擁有有自己的AADO.NNET 接接口并且基基于微軟的的.NETT 體系架架構。眾所所周知.NNET 體體系不同于于COM 體系,AADO.NNET 接接口也就完完全不同于于ADO和和OLE DB 接接口,這也也就是說AADO.NNET 和和ADO是是兩種數據據訪問方式式。ADOO.nett 提供對對XML 的支持。21. NNew ddelette 與mmallooc frree 的的聯系與區區別?答案:都是是在堆(hheap)上進行動動態的內存存操作。用用mallloc函數數需要指定定內存分配配的字節數數并且不能能初始化對對象,neew 會自自動調用對對象的構造造函數。ddelette 會

37、調調用對象的的desttructtor,而而freee 不會調調用對象的的desttructtor.22. #defiine DDOUBLLE(x) x+xx ,i = 5*DOUBBLE(55); ii 是多少少?答案:i 為30。23. 有有哪幾種情情況只能用用intiializzatioon liist 而而不能用aassiggnmennt?答案:當類類中含有cconstt、refferennce 成成員變量;基類的構構造函數都都需要初始始化表。24. CC+是不不是類型安安全的?答案:不是是。兩個不不同類型的的指針之間間可以強制制轉換(用用reinnterppret castt)。C#

38、是類型安安全的。25. mmain 函數執行行以前,還還會執行什什么代碼?答案:全局局對象的構構造函數會會在maiin 函數數之前執行行。26. 描描述內存分分配方式以以及它們的的區別?1) 從靜靜態存儲區區域分配。內存在程程序編譯的的時候就已已經分配好好,這塊內內存在程序序的整個運運行期間都都存在。例例如全局變變量,sttaticc 變量。2) 在棧棧上創建。在執行函函數時,函函數內局部部變量的存存儲單元都都可以在棧棧上創建,函函數執行結結束時這些些存儲單元元自動被釋釋放。棧內內存分配運運算內置于于處理器的的指令集。3) 從堆堆上分配,亦亦稱動態內內存分配。程序在運運行的時候候用malllo

39、c 或neww 申請任任意多少的的內存,程程序員自己己負責在何何時用frree 或或deleete 釋釋放內存。動態內存存的生存期期由程序員員決定,使使用非常靈靈活,但問問題也最多多。27.sttructt 和 cclasss 的區別別答案:sttructt 的成員員默認是公公有的,而而類的成員員默認是私私有的。sstrucct 和 classs 在其其他方面是是功能相當當的。從感情上講講,大多數數的開發者者感到類和和結構有很很大的差別別。感覺上上結構僅僅僅象一堆缺缺乏封裝和和功能的開開放的內存存位,而類類就象活的的并且可靠靠的社會成成員,它有有智能服務務,有牢固固的封裝屏屏障和一個個良好定義

40、義的接口。既然大多多數人都這這么認為,那那么只有在在你的類有有很少的方方法并且有有公有數據據(這種事事情在良好好設計的系系統中是存存在的!)時時,你也許許應該使用用 strruct 關鍵字,否否則,你應應該使用 classs 關鍵鍵字。 28.當一一個類A 中沒有聲聲明任何成成員變量與與成員函數數,這時ssizeoof(A)的值是多多少,如果果不是零,請請解釋一下下編譯器為為什么沒有有讓它為零零。(Auutodeesk)答案:肯定定不是零。舉個反例例,如果是是零的話,聲聲明一個cclasss A110對象象數組,而而每一個對對象占用的的空間是零零,這時就就沒辦法區區分A00,A1了。29. 在

41、在80866 匯編下下,邏輯地地址和物理理地址是怎怎樣轉換的的?(Inntel)答案:通用用寄存器給給出的地址址,是段內內偏移地址址,相應段段寄存器地地址*100H+通用用寄存器內內地址,就就得到了真真正要訪問問的地址。30. 比比較C+中的4種種類型轉換換方式?請參考:hhttp:/wfwdd/arcchivee/20006/055/30/7637785.aaspx,重重點是sttaticc_casst, ddynammic_ccast和和reinnterppret_castt的區別和和應用。31.分別別寫出BOOOL,iint,ffloatt,指針類類型的變量量a 與“零”的比較語語句。答

42、案:BOOL : iff ( !a ) or iif(a)int : if ( a = 00)floatt : cconstt EXPPRESSSION EXP = 0.0000001if ( a -EEXP)pointter : if ( a != NNULL) or if(aa = NULLL)32.請說說出connst與#defiine 相相比,有何何優點?答案:1) consst 常量量有數據類類型,而宏宏常量沒有有數據類型型。編譯器器可以對前前者進行類類型安全檢檢查。而對對后者只進進行字符替替換,沒有有類型安全全檢查,并并且在字符符替換可能能會產生意意料不到的的錯誤。2) 有些些集成

43、化的的調試工具具可以對cconstt 常量進進行調試,但但是不能對對宏常量進進行調試。33.簡述述數組與指指針的區別別?數組要么在在靜態存儲儲區被創建建(如全局局數組),要要么在棧上上被創建。指針可以以隨時指向向任意類型型的內存塊塊。(1)修改改內容上的的差別char a = “hhelloo”;a0 = XX;char *p = “worlld”; / 注意pp 指向常常量字符串串p0 = X; / 編譯器器不能發現現該錯誤,運運行時錯誤誤(2) 用用運算符ssizeoof 可以以計算出數數組的容量量(字節數數)。siizeoff(p),p 為指指針得到的的是一個指指針變量的的字節數,而而不

44、是p 所指的內內存容量。C+/C 語言言沒有辦法法知道指針針所指的內內存容量,除除非在申請請內存時記記住它。注注意當數組組作為函數數的參數進進行傳遞時時,該數組組自動退化化為同類型型的指針。char a = hhelloo worrld;char *p = a;cout siizeoff(a) eendl; / 12 字字節cout siizeoff(p) eendl; / 4 字節節計算數組和和指針的內內存容量void Funcc(chaar a100)cout siizeoff(a) eendl; / 4 字節節而不是1100 字字節34.類成成員函數的的重載、覆覆蓋和隱藏藏區別?答案:a

45、.成員函函數被重載載的特征:(1)相同同的范圍(在在同一個類類中);(2)函數數名字相同同;(3)參數數不同;(4)viirtuaal 關鍵鍵字可有可可無。b.覆蓋是是指派生類類函數覆蓋蓋基類函數數,特征是是:(1)不同同的范圍(分分別位于派派生類與基基類);(2)函數數名字相同同;(3)參數數相同;(4)基類類函數必須須有virrtuall 關鍵字字。c.“隱藏藏”是指派生生類的函數數屏蔽了與與其同名的的基類函數數,規則如如下:(1)如果果派生類的的函數與基基類的函數數同名,但但是參數不不同。此時時,不論有有無virrtuall關鍵字,基基類的函數數將被隱藏藏(注意別別與重載混混淆)。(2)

46、如果果派生類的的函數與基基類的函數數同名,并并且參數也也相同,但但是基類函函數沒有vvirtuual 關關鍵字。此此時,基類類的函數被被隱藏(注注意別與覆覆蓋混淆)35. TTheree aree twoo intt varriablles: a annd b, donnt uuse “if”, “? :”, “swiitch”or ootherr juddgemeent sstateementts, ffind out the bigggest one of tthe ttwo nnumbeers.答案:( ( a + b ) + abs( a - b ) ) / 236. 如如何打印出出當

47、前源文文件的文件件名以及源源文件的當當前行號?答案:cout _FILLE_ ;cout_LLINE_ ;_FILLE_和和_LIINE_是系統預預定義宏,這這種宏并不不是在某個個文件中定定義的,而而是由編譯譯器定義的的。37. mmain 主函數執執行完畢后后,是否可可能會再執執行一段代代碼,給出出說明?答案:可以以,可以用用_oneexit 注冊一個個函數,它它會在maain 之之后執行iint ffn1(vvoid), fnn2(vooid), fn33(voiid), fn4 (voiid);void mainn( vooid )Strinng sttr(zzhangglin);_on

48、exxit( fn1 );_onexxit( fn2 );_onexxit( fn3 );_onexxit( fn4 );printtf( Thiss is execcutedd firrst.n );int ffn1()printtf( nextt.n );returrn 0;int ffn2()printtf( execcutedd );returrn 0;int ffn3()printtf( is );returrn 0;int ffn4()printtf( Thiss );returrn 0;The _onexxit ffuncttion is ppasseed thhe adddre

49、sss off a ffuncttion (funnc) tto bee callled whenn thee proogramm terrminaates normmallyy. Suuccesssivee callls tto _oonexiit crreatee a rregisster of ffuncttionss thaat arre exxecutted iin LIIFO (lastt-in-firsst-ouut) oorderr. Thhe fuunctiions passsed tto _oonexiit caannott takke paarameeterss.38.

50、如如何判斷一一段程序是是由C 編編譯程序還還是由C+編譯程程序編譯的的?答案:#ifdeef _cpluuspluuscoutc+;#elseecoutc;#endiif39.文件件中有一組組整數,要要求排序后后輸出到另另一個文件件中答案:i nccludeei nccludeeusingg nammespaace sstd;void Ordeer(veectorr& ddata) /bbubblle soortint ccountt = ddata.sizee() ;int ttag = fallse ; / 設置是否否需要繼續續冒泡的標標志位for ( intt i = 0 ; i cou

51、unt ; i+)for ( intt j = 0 ; j daatajj+1)tag = truue ;int ttemp = daatajj ;dataj = dattaj+1 ;dataj+1 = ttemp ;if ( !tagg )breakk ;void mainn( vooid )vectoordaata;ifstrream in(c:dataa.txtt);if ( !in)coutttemp;data.pushh_bacck(teemp);in.cllose(); /關閉輸輸入文件流流Orderr(datta);ofstrream out(c:ressult.txt);if

52、( !outt)coutfiile eerrorr!;exit(1);for ( i = 0 ; i datta.siize() ; ii+)outdataaineext = NUULL )returrn heead;Node *p1 = heead ;Node *p2 = p11-neext ;Node *p3 = p22-neext ;p1-nnext = NUULL ;whilee ( pp3 != NULLL )p2-nnext = p11 ;p1 = p2 ;p2 = p3 ;p3 = p3-nextt ;p2-nnext = p11 ;head = p22 ;returrn hee

53、ad ;(2)已知知兩個鏈表表headd1 和hhead22 各自有有序,請把把它們合并并成一個鏈鏈表依然有有序。(保保留所有結結點,即便便大小相同同)Node * Meerge(Nodee *heead1 , Noode *headd2)if ( headd1 = NULLL)returrn heead2 ;if ( headd2 = NULLL)returrn heead1 ;Node *heaad = NULLL ;Node *p1 = NUULL;Node *p2 = NUULL;if ( headd1-ddata datta )head = heead1 ;p1 = headd1-n

54、next;p2 = headd2 ;elsehead = heead2 ;p2 = headd2-nnext ;p1 = headd1 ;Node *pcuurrennt = headd ;whilee ( pp1 != NULLL & p2 != NNULL)if ( p1-dataa dataa )pcurrrent-nexxt = p1 ;pcurrrent = p11 ;p1 = p1-nextt ;elsepcurrrent-nexxt = p2 ;pcurrrent = p22 ;p2 = p2-nextt ;if ( p1 != NUULL )pcurrrent-nexxt =

55、p1 ;if ( p2 != NUULL )pcurrrent-nexxt = p2 ;returrn heead ;(3)已知知兩個鏈表表headd1 和hhead22 各自有有序,請把把它們合并并成一個鏈鏈表依然有有序,這次次要求用遞遞歸方法進進行。 (Autoodeskk)答案:Node * MeergeRRecurrsivee(Nodde *hhead11 , NNode *heaad2)if ( headd1 = NULLL )returrn heead2 ;if ( headd2 = NULLL)returrn heead1 ;Node *heaad = NULLL ;if ( h

56、eadd1-ddata datta )head = heead1 ;head-nexxt = MerggeReccursiive(hhead11-neext,hhead22);elsehead = heead2 ;head-nexxt = MerggeReccursiive(hhead11,heaad2-nextt);returrn heead ;41. 分分析一下這這段程序的的輸出 (Autoodeskk)classs Bpubliic:B()coutdeefaullt coonstrructoorendll;B()coutdeestruuctedd iinstaance of BB)cou

57、tcoonstrructeed byy parrametter dataa eendl;privaate:int ddata;B Plaay( BB b)returrn b ;(1) rresullts:int mmain(int argcc, chhar* argvv) consstruccted by pparammeterr 5 desstruccted B(5)形參析構構B t1 = Pllay(55); BB t2 = Pllay(tt1); deestruuctedd t1形形參析構returrn 0; ddestrructeed t22注意順順序! desstruccted t1

58、(2) rresullts:int mmain(int argcc, chhar* argvv) consstruccted by pparammeterr 5 desstruccted B(5)形參析構構B t1 = Pllay(55); BB t2 = Pllay(110); coonstrructeed byy parrametter 110returrn 0; ddestrructeed B(10)形形參析構 desstruccted t2注注意順序!destrructeed t1142. 寫寫一個函數數找出一個個整數數組組中,第二二大的數 (miccrosooft)答案:constt

59、 intt MINNNUMBBER = -322767 ;int ffind_sec_max( intt datta , innt coount)int mmaxnuumberr = ddata0 ;int ssec_mmax = MINNNUMBBER ;for ( intt i = 1 ; i maaxnummber )sec_mmax = maxxnumbber ;maxnuumberr = ddatai ;elseif ( dataai seec_maax )sec_mmax = dattai ;returrn seec_maax ;43. 寫寫一個在一一個字符串串(n)中中尋找一個個

60、子串(mm)第一個個位置的函函數。KMP算法法效率最好好,時間復復雜度是(n+mm)。44. 多多重繼承的的內存分配配問題:比如有cllass A : publlic cclasss B, publlic cclasss C 那么A的內內存結構大大致是怎么么樣的?這個是coompiller-ddepenndentt的, 不不同的實現現其細節可可能不同。如果不考慮慮有虛函數數、虛繼承承的話就相相當簡單;否則的話話,相當復復雜。可以參考深入探索索C+對對象模型,或者:http:/wfwdd/arcchivee/20006/055/30/7637797.aaspx45. 如如何判斷一一個單鏈表表是有

溫馨提示

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

評論

0/150

提交評論