【正文】
tern C聲明后,模塊A的頭文件變?yōu)椋?/ 模塊A頭文件 ifndef MODULE_A_Hdefine MODULE_A_Hextern C int foo( int x, int y )。我們?cè)谒伎紗?wèn)題時(shí),不能只停留在這個(gè)語(yǔ)言是怎么做的,還要問(wèn)一問(wèn)它為什么要這么做,動(dòng)機(jī)是什么,這樣我們可以更深入地理解許多問(wèn)題):實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程。} // c++實(shí)現(xiàn)文件,調(diào)用add:extern C{#i nclude }int main(int argc, char* argv[]){add(2,3)。C引用C++函數(shù)例子工程中包含的三個(gè)文件的源代碼如下://C++頭文件 ifndef CPP_EXAMPLE_Hdefine CPP_EXAMPLE_Hextern C int add( int x, int y )。return 0。前兩種(類(lèi)繼承)和后一種(對(duì)象組合=接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。從定義上來(lái)說(shuō):重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類(lèi)型不同,或許兩者都不同)。和function func(p:string):integer。當(dāng)子類(lèi)重新定義了父類(lèi)的虛函數(shù)后,父類(lèi)指針根據(jù)賦給它的不同的子類(lèi)指針,動(dòng)態(tài)的調(diào)用屬于子類(lèi)的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無(wú)法確定的(調(diào)用的子類(lèi)的虛函數(shù)的地址無(wú)法給出)。但是Ado使用OLE DB 接口并基于微軟的COM 技術(shù), 擁有自己的 體系架構(gòu)。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對(duì)象,new 會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。兩個(gè)不同類(lèi)型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpret cast)。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。 和 class 的區(qū)別答案:struct 的成員默認(rèn)是公有的,而類(lèi)的成員默認(rèn)是私有的。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類(lèi)有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)時(shí),你也許應(yīng)該使用 struct 關(guān)鍵字,否則,你應(yīng)該使用 class 關(guān)鍵字。29. 在8086 匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄存器內(nèi)地址,就得到了真正要訪問(wèn)的地址。amp。2) 有些集成化的調(diào)試工具可以對(duì)const 常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。a[0] = ‘X’。sizeof(p),p 為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量。char *p = a。 // 4 字節(jié)而不是100 字節(jié)} 、覆蓋和隱藏區(qū)別?答案::(1)相同的范圍(在同一個(gè)類(lèi)中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual 關(guān)鍵字可有可無(wú)?!。?)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,并且參數(shù)也相同,但是基類(lèi)函數(shù)沒(méi)有virtual 關(guān)鍵字。37. main 主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說(shuō)明? 答案:可以,可以用_onexit 注冊(cè)一個(gè)函數(shù),它會(huì)在main 之后執(zhí)行int fn1(void), fn2(void), fn3(void), fn4 (void)。_onexit( fn3 )。return 0。return 0。elsecoutc。int tag = false 。 j count i 1 。data[j+1] = temp 。if ( !in){coutfile error!。(temp)。if ( !out){coutfile error!。 i++) outdata[i] 。}。Node *p2 = p1next 。p1 = p2 。head = p2 。if ( head2 == NULL)return head1 。if ( head1data head2data ){head = head1 。p2 = head2next 。amp。}else {pcurrentnext = p2 。if ( p2 != NULL )pcurrentnext = p2 。if ( head2 == NULL)return head1 。}else {head = head2 。}~B(){ coutdestructedendl。B Play( B b) {return b ?! ?destructed t2 注意順序!} destructed t1(2) results:int main(int argc, char* argv[]) constructed by parameter 5{ destructed B(5)形參析構(gòu)B t1 = Play(5)。int find_sec_max( int data[] , int count){int maxnumber = data[0] 。 i++){if ( data[i] maxnumber ){sec_max = maxnumber 。}43. 寫(xiě)一個(gè)在一個(gè)字符串(n)中尋找一個(gè)子串(m)第一個(gè)位置的函數(shù)??梢詤⒖肌渡钊胩剿鰿++對(duì)象模型》,或者:45. 如何判斷一個(gè)單鏈表是有環(huán)的?(注意不能用標(biāo)志位,最多只能用兩個(gè)額外指針)struct node { char val。while(fast!=NULL amp?!f(low==fast) return true。char sex。}*linklist。hnext = NULL。i++){ s = (struct stu *)malloc(sizeof(struct stu))。ssex,amp。訪問(wèn)固定的內(nèi)存位置(Accessing fixed memory locations) C C++ Development10. 嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問(wèn)某特定的內(nèi)存位置的特點(diǎn)。這一問(wèn)題測(cè)試你是否知道為了訪問(wèn)一絕對(duì)地址把一個(gè)整型數(shù)強(qiáng)制轉(zhuǎn)換(typecast)為一指針是合法的。 *ptr = 0xaa55。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字__interrupt。 return area。如果你沒(méi)有看到這一點(diǎn),你被雇用的機(jī)會(huì)等同第一項(xiàng)。 4). 與第三點(diǎn)一脈相承,printf()經(jīng)常有重入和性能上的問(wèn)題。 int b = 20。原因是當(dāng)表達(dá)式中存在有符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)類(lèi)型。13. 評(píng)價(jià)下面的代碼片斷:unsigned int zero = 0。這一問(wèn)題真正能揭露出應(yīng)試者是否懂得處理器字長(zhǎng)的重要性。但如果顯然應(yīng)試者做得不錯(cuò),那么我就扔出下面的追加 問(wèn)題,這些問(wèn)題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯(cuò)。這個(gè)主題已經(jīng)在ESP雜志中被廣泛地討論過(guò)了(主要是 . Plauger, 他的解釋遠(yuǎn)遠(yuǎn)超過(guò)我這里能提到 的任何解釋),所有回過(guò)頭看一下這些雜志吧!讓?xiě)?yīng)試者進(jìn)入一種虛假的安全感覺(jué)后,我拿出這么一個(gè)小節(jié)目:下面的代碼片段的輸出是什么,為什么?char *ptr。最近在我的一個(gè)同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個(gè)合法的指針之后,我才想到這個(gè)問(wèn)題。Typedef 15. Typedef 在C語(yǔ)言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類(lèi)型的同義字。哪種方法更好呢?(如果有的話)為什么? 這是一個(gè)非常微妙的問(wèn)題,任何人答對(duì)這個(gè)問(wèn)題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。第一個(gè)擴(kuò)展為 struct s * p1, p2。 c = a+++b。因此,上面的代碼被處理成: c = a++ + b。我發(fā)現(xiàn)這個(gè)問(wèn)題的最大好處是:這是一個(gè)關(guān)于代碼編寫(xiě)風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題What will print out? main() { char *p1=“name”。 while(*p2++ = *p1++)。 y= ++y + ++x。 }Answer: 5,20,1 What will be printed as the result of the operation below:define swap(a,b) a=a+b。 swap (x,y)。 } int swap2(int a, int b) { int temp。 return 0。 ptr++。 printf(“%s”,s1)。 p2=(char *)malloc(25)。 printf(“%s”,p1)。 } int changevalue(int x) { return(x+=1)。 x++。 changevalue(x)。 } Answer: 12 , 13 , 13 What will be printed as the result of the operation below: main(){ int x=10, y=15。 } Answer: 11, 16 What will be printed as the result of the operation below:main(){ int a=0?!。欠窨赡軙?huì)再執(zhí)行一段代碼? 函數(shù),如果子類(lèi)覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)?在子類(lèi)的空間里,有沒(méi)有父類(lèi)的這個(gè)函數(shù),或者父類(lèi)的私有變量?、例如 “ababc”要求返回“ab”. 因?yàn)椤癮b”連續(xù)重復(fù)出現(xiàn)且最長(zhǎng)。 sprintf、strcpy 及 memcpy 函數(shù),請(qǐng)問(wèn)這些函數(shù)有什么區(qū)別,你喜歡使用哪個(gè),為什么?? 32 位平臺(tái)上的運(yùn)行結(jié)果,并說(shuō)明 sizeof 的性質(zhì):include include int main(void) { char a[30]。 printf(%d\n, sizeof(a[3]))。}。 c)請(qǐng)編寫(xiě)一個(gè) C 函數(shù),該函數(shù)將給定的一個(gè)整數(shù)轉(zhuǎn)換成字符串。給出演示上述函數(shù)功能的一個(gè)簡(jiǎn)單程序,并請(qǐng)編寫(xiě)對(duì)應(yīng)的 Makefile 文件,需要處理大量圖形(Shape)信息,圖形有矩形(Rectangle),正方形(Square),圓形 (Circle)等種類(lèi),應(yīng)用需要計(jì)算這些圖形的面積,并且可能需要在某個(gè)設(shè)備上進(jìn)行顯示(使用在標(biāo)準(zhǔn)輸出上打印信息的方式做為示意)。 assert(() == 150)。char buf[4]。}a) When piled and executed on x86, why does this program usually not output what the programmer intended? b) Name several ways in which the security problem that causes this program not to output what the programmer intended can be prevented WITHOUT changing the code. w=1,x=2,y=3,z=4。printf(m=%d,m)。//這里幫忙解釋一下 for(i=0。//這里也幫忙看一下 fclose(fp)。b,sizeof(int),1,fp)。 struct node *front,*next。}void main(){printf(%s, GetStr())。實(shí)現(xiàn)一個(gè)WORD(2個(gè)字節(jié))的高低位交換!!,P2,P3,P4內(nèi)存來(lái)做緩沖,大小自定,但這四個(gè)緩沖的大小要一樣,并且是連續(xù)的!,用C語(yǔ)言寫(xiě)一函數(shù)實(shí)現(xiàn)對(duì)浮點(diǎn)數(shù)組A進(jìn)行降序排序,并輸出結(jié)果,要求要以數(shù)組A作為函數(shù)的入口.(建議用冒泡排序法):include include class Base{private:char * name。}char * copyName(){char newname [256]。}static void print(Base base){printf(name: %s\n , )。Base::print(*pBase)。} ,函數(shù)接收一個(gè)字符串,是由十六進(jìn)制數(shù)組成的一組字符串,.,將前半部分按ASCII碼升序排序,后半部分不變,(如果字符串是奇數(shù)則中間的字符不變,)最后再將前后兩部分交換,然后將該字符串輸出,測(cè)試字符串“ADZDDJKJFIEJHGI”Void test1(){ char string[10]。for(I=0。}strcpy(string, str1)。 int I。}}if(I=MAX_SRM) return (NULL_SRM)。c+=1。int a=2。}}34. int func(int a){ int b。 default: 0 }return b。 a[2]=2。a[2]。 s=s1。:無(wú)序數(shù)組,折半查找,各元素值唯一。并說(shuō)明為什么。sizeof(S1) = ?class X{public:X()。virtual void myVirtualFunc()