cc面試題大匯總_第1頁
cc面試題大匯總_第2頁
cc面試題大匯總_第3頁
cc面試題大匯總_第4頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

cc面試題大匯總cc面試題大匯總2016-07-24瀏覽:分享人:尹影璐手機(jī)版1.求下面函數(shù)的返回值(微軟)intfunc(x)(intcountx=0;while(x){countx++;x=x&(x'l);returncountx;假定x=9999〇答案:8思路:將x轉(zhuǎn)化為2進(jìn)制,看含有的1的個數(shù)。每取一次&會消去1個1;.什么是“弓I用”?申明和使用“引用”要注意哪些問題?1引用就是某個目標(biāo)變量的“別名”(alias),對應(yīng)用的操作與對變量直接操作效果完全相同。2申明一個引用的時候,切記要對其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。3聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標(biāo)變量名的ー個別名,它本身不是ー種數(shù)據(jù)類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。4不能建立數(shù)組的引用。.將“引用”作為函數(shù)參數(shù)有哪些特點?(1)傳遞引用給函數(shù)與傳遞指針的效果是ー樣的。這時,被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實參變量或?qū)ο蟮末`個別名來使用,所以在被調(diào)函數(shù)中對形參變量的操作就是對其相應(yīng)的目標(biāo)對象(在主調(diào)函數(shù)中)的操作。(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲單元,且需要重復(fù)使用"?指針變量名"的形式進(jìn)行運算,這很容易產(chǎn)生錯誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。.在什么時候需要使用“常引用”?如果既要利用引用提髙程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。常引用聲明方式:const類型標(biāo)識符&引用名二目標(biāo)變量名;例1inta;constint&ra=a;ra=1;/Z錯誤a=1;//正確例2stringfoo();voidbar(string&s)//下面的表達(dá)式都是非法的bar(foo());bar("helloworld");原因在于foo()和"helloworld"串都是產(chǎn)生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此上面的表達(dá)式就是試圖將一個const類型的對象轉(zhuǎn)換為非const類型,這是非法的。引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const〇5,將“引用”作為函數(shù)返回值類型的格式、好處和需要遵守的規(guī)則?格式:類型標(biāo)識符&函數(shù)名(形參列表及類型說明)(〃函數(shù)體好處:在內(nèi)存中不產(chǎn)生被返回值的副本;(注意:正是因為這點原因,所以返回一個局部變量的引用是不可取的。因為隨著該局部變量生存期的結(jié)束,相應(yīng)的引用也會失效,產(chǎn)生runtimeerror!注意:(1)不能返回局部變量的引用。主要原因是局部變量會在函數(shù)返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進(jìn)入未知狀態(tài)。(2)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用??蓪τ谶@種情況,又面臨其它尷尬局面。例如,被函數(shù)返回的引用只是作為ー個臨時變量出現(xiàn),而沒有被賦予ー個實際的變量,那么這個引用所指向的空間(由new分配)就無法釋放,造成memoryleako⑶可以返回類成員的引用,但最好是const。(4)流操作符重載返回值申明為“引用”的作用:流操作符》,這兩個操作符常常希望被連續(xù)使用,例如:coutttincludeint&put(intn);intvals[10];interror=-1;voidmain()]put(0)=10;//以put(0)函數(shù)值作為左值,等價于vals[0]=10;put(9)=20;//以put(9)函數(shù)值作為左值,等價于vals[9]=20;coutcout}int&put(intn){if(n>=0&&n{returnvals[n];else{coutreturnerror;)(5)在另外的一些操作符中,卻千萬不能返回引用:+-*/四則運算符。它們不能返回引用,EffectiveC++El]的Item23詳細(xì)的討論了這個問題。主要原因是這四個操作符沒有sideeffect?因此,它們必須構(gòu)造ー個對象作為返回值,可選的方案包括:返回一個對象、返回一個局部變量的引用,返回ー個new分配的對象的引用、返回一個靜態(tài)對象引用。根據(jù)前面提到的引用作為返回值的三個規(guī)則,第2、3兩個方案都被否決了。靜態(tài)對象的引用又因為((a+b)==(c+d))會永遠(yuǎn)為true而導(dǎo)致錯誤。所以可選的只剩下返回一個對象了。.“引用’‘與多態(tài)的關(guān)系?引用是除指針外另ー個可以產(chǎn)生多態(tài)效果的手段。這意味著,一個基類的引用可以指向它的派生類實例ClassA;ClassB:ClassABb;A&ref=b;.“引用''與指針的區(qū)別是什么?指針通過某個指針變量指向ー個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對引用的操作就是對目標(biāo)變量的操作,可讀性強(qiáng)。.什么時候需要“引用”?流操作符)、賦值操作符二的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符二的參數(shù)。.結(jié)構(gòu)與聯(lián)合有和區(qū)別?.結(jié)構(gòu)和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成,但在任何同一時刻,聯(lián)合中只存放了一個被選中的成員(所有成員共用ー塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。.對于聯(lián)合的不同成員賦值,將會對其它成員重寫,原來成員的值就不存在了,而對于結(jié)構(gòu)的不同成員賦值是互不影響的。.下面關(guān)于“聯(lián)合”的題目的輸出?a)#includeunion{inti;charx[2];}a;voidmain(){[0]=10;[1]=1;printf("%d",);答案:266union這種類型,就是內(nèi)部的變量共同使用ー塊空間,按照size大的分配inti占4個字節(jié)charx[2]占2個,所以ー共分配了4個字節(jié)可以使用sizeof(a)來看下它的總大小ー共4個字節(jié)的內(nèi)存,對應(yīng)x來說相當(dāng)于占用了低2個字節(jié),低位低地址,高位高地址,而給x賦值的1,和10,就存在個位和十位上按照內(nèi)存分布,x改之后內(nèi)存為0x010a也就是說,i的內(nèi)存時0x10ab)union{inti;struct{charfirst;charsecond;}half;}number;=0x4241;printf("%c%c\n",,);二'a';='b';printf("%x\n",);答案:AB(0x41對應(yīng)'A',是低位;0x42對應(yīng)’B',是高位)6261(和共用ー塊地址空間).已知strcpy的函數(shù)原型:char*strcpy(char*strDest,constchar*strSrc)其中strDest是目的字符串,strSrc是源字符串。不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù)strcpyo答案:^include^includechar*strcpy(char*strDest,constchar*strSrc)assert((strDest!=NULL)&&(strSrc!=NULL));//2分char*address:strDest;〃2分while((*strDest++=*strSrc++)!='\0'〃2分NULL;returnaddress; 〃2分另外strlen函數(shù)如下:ttinclude#includeintstrlen(constchar*str)/Z輸入?yún)?shù)const{assert(str!=NULL);//斷言字符串地址非〇intlen=0;while((*str++)!='\〇1){len++;returnlen;.已知String類定義如下:classStringpublic:String(constchar*str=NULL);//通用構(gòu)造函數(shù)String(constString&another);/Z拷貝構(gòu)造函數(shù)?String。;/Z析構(gòu)函數(shù)String&operater=(constString&rhs);/Z賦值圖數(shù)private:char*mdata;/Z用于保存字符串};嘗試寫出類的成員函數(shù)實現(xiàn)。答案:String::String(constchar*str)(if(str==NULL)//strlen在參數(shù)為NULL時會拋異常オ會有這步判斷{m_data=newchar[1];m_data[0]='\0';elsem_data=newchar[strlen(str)+1];strcpy(m_data,str);String::String(constString&another)(m_data二newchar[strlen(_data)+1];strcpy(m_data,_data);}String&String::operator=(constString&rhs){if(this=&rhs)return*this;□m_data;〃刪除原來的數(shù)據(jù),新開ー塊內(nèi)存mdata=newchar[strlen(data)+1];strcpy(mdata,data);return*this;String::String()data;..h頭文件中的ifndef/define/endif的作用?答:防止該頭文件被重復(fù)引用。.#include與#include""的區(qū)另!!?答:前者是從StandardLibrary的路徑尋找和引用,而后者是從當(dāng)前工作路徑搜尋并引用。.在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern"C”?首先,作為extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明。例如,如果模塊B欲引用該模塊A中定義的全局變量和函數(shù)時只需包含模塊A的頭文件即可。這樣,模塊B中調(diào)用模塊A中的函數(shù)時,在編譯階段,模塊B雖然找不到該函數(shù),但是并不會報錯;它會在連接階段中從模塊A編譯生成的目標(biāo)代碼中找到此函數(shù)extern"C"是連接申明(linkagedeclaration),被extern"C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的,來看看C++中對類似。c的函數(shù)是怎樣編譯的:作為一種面向?qū)ο蟮恼Z言,C++支持函數(shù)重載,而過程式語言C則不支持。函數(shù)被C++編譯后在符號庫中的名字與C語言的不同。例如,假設(shè)某個函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C編譯器編譯后在符號庫中的名字為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱為amanglednamev)〇_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來實現(xiàn)函數(shù)重載的。例如,在C++中,函數(shù)voidfoo(intx,inty)與voidfoo(intx.floaty)編譯生成的符號是不相同的,后者為_foo_int_float〇同樣地,C++中的變量除支持局部變量外,還支持類成員變量和全局變量。用戶所編寫程序的類成員變量可能與全局變量同名,我們以"."來區(qū)分。而本質(zhì)上,編譯器在進(jìn)行編譯時,與函數(shù)的處理相似,也為類中的變量取了一個獨ー無二的名字,這個名字與用戶程序中同名的全局變量名字不同。未加extern"C"聲明時的連接方式假設(shè)在C++中,模塊A的頭文件如下:/Z模塊A頭文件ttifndefMODULEAHttdefineMODULEAHintfoo(intx,inty);#endif在模塊B中引用該函數(shù):/Z模塊B實現(xiàn)文件ttinclude""foo(2,3);實際上,在連接階段,連接器會從模塊A生成的目標(biāo)文件中尋找_foo_int_int這樣的符號!加extem"C"聲明后的編譯和連接方式加extem"C"聲明后,模塊A的頭文件變?yōu)?/Z模塊A頭文件ttifndefM0DULE_A_HttdefineM0DULE_A_Hextern"C"intfoo(intx,inty);ttendif在模塊B的實現(xiàn)文件中仍然調(diào)用foo(2,3),其結(jié)果是:(1)模塊A編譯生成foo的目標(biāo)代碼時,沒有對其名字進(jìn)行特殊處理,采用了C語言的方式;(2)連接器在為模塊B的目標(biāo)代碼尋找foo(2,3)調(diào)用時,尋找的是未經(jīng)修改的符號名.foo。如果在模塊A中函數(shù)聲明了foo為extern"C"類型,而模塊B中包含的是externintfoo(intx,inty),則模塊B找不到模塊A中的函數(shù);反之亦然。所以,可以用一句話概括extern"C”這個聲明的真實目的(任何語言中的任何語法特性的誕生都不是隨意而為的,來源于真實世界的需求驅(qū)動。我們在思考問題時,不能只停留在這個語言是怎么做的,還要問ー問它為什么要這么做,動機(jī)是什么,這樣我們可以更深入地理解許多問題):實現(xiàn)C++與C及其它語言的混合編程。明白了C++中extern"C"的設(shè)立動機(jī),我們下面來具體分析extern"C"通常的使用技巧:exte門!"C"的慣用法(1)在C++中引用C語言中的函數(shù)和變量,在包含C語言頭文件(假設(shè)為)時,需進(jìn)行下列處理:extern"C"(ttinclude""而在C語言的頭文件中,對其外部函數(shù)只能指定為extern類型,C語言中不支持extern"C"聲明,在.c文件中包含了extern"?!瘯r會出現(xiàn)編譯語法錯誤。C++引用C函數(shù)例子工程中包含的三個文件的源代碼如下:ttifndefC_EXAMPLE_HttdefineC_EXAMPLE_Hexternintadd(intx,inty);#endifttinclude""intadd(intx,inty)(returnx+y;//c++實現(xiàn)文件,調(diào)用add:extern"C"{#include""intmain(intargc,char*argv[]){add(2,3);returnO;如果C++調(diào)用一個C語言編寫的.DLL時,當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時,應(yīng)加extern"C"{}。(2)在C中引用C++語言中的函數(shù)和變量時,C++的頭文件需添加extern"?!?但是在C語言中不能直接引用聲明了extern"C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern"C"函數(shù)聲明為extern類型。C引用C++函數(shù)例子工程中包含的三個文件的源代碼如下:〃C++頭文件ttifndefCPP_EXAMPLE_HttdefineCPP_EXAMPLE_Hextern"C"intadd(intx,inty);ttendif〃C++實現(xiàn)文件^include""intadd(intx,inty){returnx+y;:lexternintadd(intx,inty);intmain(intargc,char*argv[])(add(2,3);returnO;.關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個類的一般性聯(lián)系,比如“學(xué)生”和“老師”就是ー種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是ー種相對松散的關(guān)系,聚合類不需要對被聚合類負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:從實現(xiàn)的角度講,聚合可以表示為:classA{...}classB{A*a; }組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類與被組合類有相同的生命周期,組合類要對被組合類負(fù)責(zé),采用實心的菱形表示組合關(guān)系:實現(xiàn)的形式是:classA{...}classB{Aa;...).面向?qū)ο蟮娜齻€基本特征,并簡單敘述之?.封裝:將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實彳亍protection(private,protected,public).繼承:廣義的繼承有三種實現(xiàn)形式:實現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實現(xiàn)滯后到子類實現(xiàn))。前兩種(類繼承)和后一種(對象組合ニ》接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。.多態(tài):系統(tǒng)能夠在運行時,能夠根據(jù)其類型確定調(diào)用哪個重載的成員函數(shù)的能力,稱為多態(tài)性。(見:C++中類的多態(tài)與虛函數(shù)的使用).重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區(qū)別???嫉念}目。從定義上來說:重載:是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。重寫:是指子類重新定義父類虛函數(shù)的方法。從實現(xiàn)原理上來說:重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對于編譯器來說是這樣的)。如,有兩個同名函數(shù):functionfunc(p:integer):integer5 和 functionfunc(p:string):integer5〇那么編譯器做過修飾后的函數(shù)名稱可能是這樣的:int_func、str_funco對于這兩個函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關(guān)!重寫:和多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運行期綁定的(晩綁定)。.多態(tài)的作用?主要是兩個:隱藏實現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實現(xiàn)代碼重用;接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某ー屬性時的正確調(diào)用。Ado與的相同與不同?除了“能夠讓應(yīng)用程序處理存儲于DBMS中的數(shù)據(jù)”這ー基本相似點外,兩者沒有太多共同之處。但是Ado使用OLEDB接ロ并基于微軟的COM技術(shù),而擁有自己的接口并且基于微軟的.NET體系架構(gòu)。眾所周知.NET體系不同于COM體系,接口也就完全不同于ADO和OLEDB接口,這也就是說和ADO是兩種數(shù)據(jù)訪問方式。提供對XML的支持。New與mallocfree的聯(lián)系與區(qū)別?答案:都是在堆(heap)上進(jìn)行動態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對象,new會自動調(diào)用對象的構(gòu)造函數(shù)。會調(diào)用對象的destructor?而free不會調(diào)用對象的destructor.(可以看看:顯式調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù))^defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?答案:i為30。(注意直接展開就是了)5*5+5有哪幾種情況只能用intializationlist而不能用assignment?答案:當(dāng)類中含有const,reference成員變量;基類的構(gòu)造函數(shù)都需要初始化表。C++是不是類型安全的?答案:不是。兩個不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)〇C#是類型安全的。main函數(shù)執(zhí)行以前,還會執(zhí)行什么代碼?答案:全局對象的構(gòu)造函數(shù)會在main函數(shù)之前執(zhí)行,為malloc分配必要的資源,等等。描述內(nèi)存分配方式以及它們的區(qū)別?1)從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量,static變量。2)在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集。3)從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free或釋放內(nèi)存。動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但問題也最多。4)代碼區(qū)。和class的區(qū)別答案:struct的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的。struct和class在其他方面是功能相當(dāng)?shù)?。從感情上講,大多數(shù)的開發(fā)者感到類和結(jié)構(gòu)有很大的差別。感覺上結(jié)構(gòu)僅僅象一堆缺乏封裝和功能的開放的內(nèi)存位,而類就象活的并且可靠的社會成員,它有智能服務(wù),有牢固的封裝屏障和一個良好定義的接口。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計的系統(tǒng)中是存在的!)時,你也許應(yīng)該使用struct關(guān)鍵字,否則,你應(yīng)該使用class關(guān)鍵字。.當(dāng)ー個類A中沒有生命任何成員變量與成員函數(shù),這時sizeof(A)的值是多少,如果不是零,請解釋ー下編譯器為什么沒有讓它為零。(Autodesk)答案:肯定不是零。舉個反例,如果是零的話,聲明ー個classA[10]對象數(shù)組,而每ー個對象占用的空間是零,這時就沒辦法區(qū)分A[0],A[l]…了。29,在8086匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址?10H+通用寄存器內(nèi)地址,就得到了真正要訪問的地址。.比較C++中的4種類型轉(zhuǎn)換方式?里點是static_cast,dynamic_cast和reinterpret_cast的區(qū)別和應(yīng)用。(以后再補上吧).分別寫出BOOL,int,float,指針類型的變量a與“零”的比較語句。答案:BOOL:if(!a)orif(a)int:if(a==0)float:constEXPRESSIONEXP=if(a-EXP)pointer:if(a!=NULL)orif(a==NULL).請說出const與#define相比,有何優(yōu)點?const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查。而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。2)有些集成化的調(diào)試工具可以對const常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。.簡述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時指向任意類型的內(nèi)存塊。(1)修改內(nèi)容上的差別chara[]="hell〇”;a[〇]='X';char*p="worldn;//注意p指向常量字符串P[0]='X';〃編譯器不能發(fā)現(xiàn)該錯誤,運行時錯誤(2)用運算符sizeof可以計算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是ー個指針變量的字節(jié)數(shù),而不是P所指的內(nèi)存容量。C++/C語言沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請內(nèi)存時記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時,該數(shù)組自動退化為同類型的指針。chara[]="helloworld";char*p=a;coutcout計算數(shù)組和指針的內(nèi)存容量voidFunc(chara[100])cout).類成員函數(shù)的重載、覆蓋和隱藏區(qū)別?答案:a.成員函數(shù)被重載的特征:(1)相同的范圍(在同一個類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtua!關(guān)鍵字可有可無。b.覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:(1)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual關(guān)鍵字。c.“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆).Therearetwointvariables:aandb,don,tuse"if","?:","switch”orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.答案:((a+b)+abs(a-b))/2.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號?答案:coutcout_FILE_和_LINE—是系統(tǒng)預(yù)定義宏,這種宏并不是在某個文件中定義的,而是由編譯器定義的.main主函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,給出說明?答案:可以,可以用atexitO函數(shù);注它會在main之后執(zhí)行intfnl(void),fn2(void),fn3(void),fn4(void);voidmain(void){Stringstr("zhanglin");atexit(fnl);atexit(fn2);atexit(fn3);atexit(fn4);printf("Thisisexecutedfirst.\n");intfnl()printf("next.\n");returnO;)intfn2()(printf("executed");returnO;}intfn3()(printf("is");returnO;}intfn4()(printf("This");returnO;}.如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?答案:ttifdef_cpluspluscout#elsecoutttendif注意,后面很多代碼啊。代碼不看也罷。.文件中有一組整數(shù),要求排序后輸出到另ー個文件中(面試官,超級喜歡考排序的。你要去面試,數(shù)據(jù)結(jié)構(gòu)的那幾個排序一定要非常熟悉,用筆也可以寫出代碼來,用筆寫代碼,就是這樣變態(tài)啊,其實感覺沒有必要這樣筆試)答案:ttincludettincludeusingnamespacestd;voidOrder(vector&data)//bubblesortintcount=();inttag=false;//設(shè)置是否需要繼續(xù)冒泡的標(biāo)志位for(inti=0;i {for(intj=0;j {if(data[j]>data[j+1])tag=true;inttemp=data[j];data"=data[j+1];data[j+1]=temp;)if(!tag)break;)voidmain(void)(vectordata;ifstreamin("c:\\");if(!in)(coutexit(1);)inttemp;while(!())in>>temp;_back(temp);();〃關(guān)閉輸入文件流Order(data);ofstreamout("c:\\");if(lout)(coutexit(1);for(i=0;iout();〃關(guān)閉輸出文件流.鏈表題:ー個鏈表的結(jié)點結(jié)構(gòu)structNode{intdata;Node*next;};typedefstructNodeNode;(1)已知鏈表的頭結(jié)點head,寫ー個函數(shù)把這個鏈表逆序(Intel)Node*ReverseList(Node*head)〃鏈表逆序if(head==NULL||headー>next==NULL)returnhead;Node*pl=head;Node*p2=pl->next;Node*p3=p2->next;pl->next二NULL;while(p3!=NULL){p2->next=pl;pl=p2;p2=p3;p3=p3->next;}p2->next=pl;head=p2;returnhead;(2)已知兩個鏈表headl和head2各自有序,請把它們合并成一個鏈表依然有序。(保留所有結(jié)點,即便大小相同)Node*Merge(Node*headl,Node*head2)if(headl=NULL)returnhead2;if(head2=NULL)returnheadl;Node*head=NULL;Node*pl=NULL;Node*p2=NULL;if(headl->datadata){head=headl;pl=headl->next;p2=head2;jelse{head=head2;p2=head2ー〉next;pl=headl;Node*pcurrent=head;while(pl!=NULL&&p2!=NULL)if(pl->datadata)pcurrent->next=pl;pcurrent二pl;pl=pl->next;}else]pcurrent->next=p2;pcurrent=p2;p2-p2->next;}jif(pl!=NULL)pcurrent->next=pl;if(p2!=NULL)pcurrent->next=p2;returnhead;(3)已知兩個鏈表headl和head2各自有序,請把它們合并成一個鏈表依然有序,這次要求用遞歸方法進(jìn)行。(Autodesk)答案:Node*MergeRecursive(Node*headl,Node*head2){if(head!ニニNULL)returnhead2;if(head2ニニNULL)returnheadl;Node*head二NULL;if(headl->datadata)(head二headl;head->next二MergeRecursive(headl->next,head2);jelse{head二head2;head->next二MergeRecursive(headl,head2->next);)returnhead;.分析一

溫馨提示

  • 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

提交評論