c與c++面-試題經(jīng)典-無(wú)出其右-_第1頁(yè)
c與c++面-試題經(jīng)典-無(wú)出其右-_第2頁(yè)
c與c++面-試題經(jīng)典-無(wú)出其右-_第3頁(yè)
c與c++面-試題經(jīng)典-無(wú)出其右-_第4頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言.static有什么用途?(請(qǐng)至少說(shuō)明兩種)1)限制變量的作用域2)設(shè)置變量的存儲(chǔ)域.引用與指針有什么區(qū)別?1)引用必須被初始化,指針不必。2)引用初始化以后不能被改變,指針可以改變所指的對(duì)象。3)不存在指向空值的引用,但是存在指向空值的指針。.描述實(shí)時(shí)系統(tǒng)的基本特性在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧.什么函數(shù)不能聲明為虛函數(shù)?constructor.寫出floatx與“零值”比較的if語(yǔ)句。if(x>0.000001&&x<-0.000001).不能做switch。的參數(shù)類型是:switch的參薪不能為實(shí)型。.局部變量能否和全局變量重名?答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用"::"局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi).如何引用ー個(gè)已經(jīng)定義過(guò)的全局變量?答:extern可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò).全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么?答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量??梢栽诓煌腃文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò).語(yǔ)句for(;1;)有什么問(wèn)題?它是什么意思?答:和while⑴點(diǎn)同。.d〇.…..while和while....do有什么區(qū)別?答:前ー個(gè)循環(huán)一遍再判斷,后ー個(gè)判斷以后再循環(huán)12.static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于ー個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。static函數(shù)與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在ー個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量仃什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值:static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝.在c語(yǔ)言庫(kù)函數(shù)中將一個(gè)字符轉(zhuǎn)換成整型的函數(shù)是atool()嗎,這個(gè)函數(shù)的原型是什么?函數(shù)名:atol功能:把字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)用法:longatol(constchar*nptr);程序例:#include<stdlib.h>#include<stdio.h>intmain(void)(longI;char*str="98765432";I=atol(lstr);printf("string=%sinteger=%ld\n",str,I);return(O);).對(duì)于ー個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)?用宏定義,c++用inline.用宏定義寫出swap(x,y)#defineswap(x,y)\x=x+y;\y=x-y;\x=x-y;.數(shù)組a[N],存放了1至N-1個(gè)數(shù),其中某個(gè)數(shù)重復(fù)一次。寫ー個(gè)函數(shù),找出被重復(fù)的數(shù)字.時(shí)間復(fù)雜度必須為。(N)函數(shù)原型:intdo_dup(inta[],intN)ー語(yǔ)句實(shí)現(xiàn)x是否為2的若干次事的判斷inti=512;cout<<boolalpha<<((i&(i-1))?false:true)<<endl;.u上述三個(gè)有什么區(qū)別?char*constp;〃常量指針,p的值不可以修改charconst*p!〃指向常量的指針,指向的常量值不可以改constchar*p;//和charconst*pcharstr1[]="abc";charstr2[]="abc";constcharstr3[]="abc";constcharstr4[]="abc";constchar*str5="abc";constchar*str6="abc";char*str7="abc";char*str8="abc";cout<< ( str1 == str2) < < endl;cout<< ( str3 == str4) < < endl;cout<< ( str5 == str6) < < endl;cout<< ( str7 == str8) < < endl;結(jié)果是:0011解答:st門,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。12.以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?[C易]voidUpperCase(charstr[])//將str中的小言字母轉(zhuǎn)換成大寫字母(for(sizeti=0;i<sizeof(str)/sizeof(str[0]);++i)if('a'<=str[i]&&str[i]<='z')str[i]-=('a'-'A');charstr[]="aBcDe";cout<<"str字符長(zhǎng)度為:"<<sizeof(str)/sizeof(str[0])<<endl;UpperCase(str);cout<<str<<endl;答:函數(shù)內(nèi)的sizeof有問(wèn)題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是ー個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是ー個(gè)指向字符串的指針,沒(méi)有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,ー個(gè)指針為4個(gè)字節(jié),因此返回4。main()(inta[5]={1,234,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}輸出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int)int*ptr=(int*)(&a+1);則ptr實(shí)際是&(aj5]),也就是a+5原因如下:&a是數(shù)組指針,其類型為int(*)[5];而指針加11要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同a是長(zhǎng)度為5的int數(shù)組指針,所以要加5*sizeof(int)所以ptr實(shí)際是a[5]但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)所以prt-1只會(huì)減去sizeof(int*)a,&a的地址是ー樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下ー個(gè)對(duì)象的地址,即a[5]..請(qǐng)問(wèn)以下代碼有什么問(wèn)題:intmain()(chara;char*str=&a;strcpy(str,"hello");printf(str);return0;沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)ー個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。char*s="AAA";printf("%s",s);s[O]='B';printf("%s",s);有什么錯(cuò)?“AAA"是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問(wèn)題。cosntchar*s="AAA";然后又因?yàn)槭浅A?所以對(duì)是s[0]的賦值操作是不合法的。1、寫ー個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的ー個(gè)。.#defineMin(X,Y)((X)>(Y)?(Y):(X))〃結(jié)尾沒(méi)有;2、嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么用C編寫死循環(huán)。while(1){}或者for(;;)3、關(guān)鍵字static的作用是什么?定義靜態(tài)變量4、關(guān)鍵字const有什么含意?表示常量不可以修改的變量。5、關(guān)鍵字volatile有什么含意?并舉出三個(gè)不同的例子?提示編譯器對(duì)象的值可能在編譯器未監(jiān)測(cè)到的情況下改變。int(*s[1O])(int)表示的是什么啊int(*s[10])(int)函數(shù)指針數(shù)組,每個(gè)指針指向ー個(gè)intfunc(intparam)的函數(shù)。.交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3;有兩種解法,一種用算術(shù)算法,ー種用“(異或)a=a+b;b=a-b;a=a-b;ora=a"b;/Z只能對(duì)int,char..b=a"b;a=a"b;ora"=b"=a;.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對(duì)象一個(gè)1:(void*)ptr和(*(void**))ptr的結(jié)果是否相同?其中ptr為同一個(gè)指針.(void*)ptr和(*(void**))ptr值是相同的2:intmain()(intx=3;printf("%d",x);return1;問(wèn)函數(shù)既然不會(huì)被其它函數(shù)調(diào)用,為什么要返回1?mian中,c標(biāo)準(zhǔn)認(rèn)為〇表示成功,非〇表示錯(cuò)誤。具體的值是某中具體出錯(cuò)信息1I要對(duì)絕對(duì)地址0x100000賦值,我們可以用(unsignedint*)0x100000=1234;那么要是想讓程序跳轉(zhuǎn)到絕對(duì)地址是0x100000去執(zhí)行,應(yīng)該怎么做?*((void(*)())0x100000)();首先要將0x100000強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:(void(*)())0x100000然后再調(diào)用它:*((void(*)0)0x100000)();用typedef可以看得更直觀些:typedefvoid(*)()voidFuncPtr;*((voidFuncPtr)Ox100000)();2,已知一個(gè)數(shù)組table,用ー個(gè)宏定義,求出數(shù)據(jù)的元素個(gè)數(shù)#defineNTBL#defineNTBL(sizeof(table)/sizeof(table[0]))面unsignedshortA=10;printf("~A=%u\n",~A);charc=128;printf("c=%d\n",c);輸出多少?并分析過(guò)程第一題,?A=0xfffffff5,int值為ー11,但輸出的是uinto所以輸出4294967285第二題,c=0x10,輸出的是int,最高位為1.是負(fù)數(shù),所以它的值就是0x00的補(bǔ)碼就是128,所以輸出一128。這兩道題都是在考察二進(jìn)制向int或uint轉(zhuǎn)換時(shí)的最高位處理。分析下面的程序:voidGetMemory(char**p,intnum)(*p=(char*)malloc(num);)intmain()(char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");free(str);if(str!=NULL)(strcpy(str,"world");)printf("\nstris%s",str);getchar();}間輸出結(jié)果是什么?希望大家能說(shuō)說(shuō)原因,先謝謝了輸出strisworld=free只是釋放的str指向的內(nèi)存空間,它本身的值還是存在的.所以free之后,有一個(gè)好的習(xí)慣就是將str=NULL.此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語(yǔ)句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,盡管這段程序確實(shí)是存在大大的問(wèn)題(上面各位已經(jīng)說(shuō)得很清楚了),但是通常會(huì)打印出world來(lái)。這是因?yàn)?進(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫(kù)函數(shù)自己完成的。當(dāng)你mallocー塊內(nèi)存的時(shí)候,管理庫(kù)向操作系統(tǒng)申請(qǐng)ー塊空間(可能會(huì)比你申請(qǐng)的大一些),然后在這塊空間中記錄ー些管理信息(一般是在你申請(qǐng)的內(nèi)存前面一點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫(kù)通常都不會(huì)將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問(wèn)這塊地址的,只不過(guò)。。。。。。。。樓上都說(shuō)過(guò)了,最好別這么干。chara[10],strlen(a)為什么等于15?運(yùn)行的結(jié)果#include"stdio.h#include"string.h"voidmain()charaa[10];printf("%d",strlen(aa));}sizeof()和初不初始化,沒(méi)有關(guān)系;strlen()和初始化有關(guān)。char(*str)[20];/*str是ー個(gè)數(shù)組指針,即指向數(shù)組的指針.*/char*str[20];/*str是ー個(gè)指針數(shù)組,其元素為指針型數(shù)據(jù).*/longa=0x801010;a+5=?0x801010用二進(jìn)制表示為:“100000000001000000010000”,十進(jìn)制的值為839272〇,再加上5就是8392725羅1)給定結(jié)構(gòu)structA(chart:4;chark:4;unsignedshorti:8;unsignedlongm;};問(wèn)sizeof(A)=?給定結(jié)構(gòu)structA(chart:4;4位chark:4;4位unsignedshorti:8;8位unsignedlongm;//偏移2字節(jié)保證4字節(jié)對(duì)齊);/Z共8字節(jié)2)下面的函數(shù)實(shí)現(xiàn)在ー個(gè)數(shù)上加一個(gè)數(shù),有什么錯(cuò)誤?請(qǐng)改正。intadd_n(intn)(staticinti=100;i+=n;returni;)當(dāng)你第二次調(diào)用時(shí)得不到正確的結(jié)果,難道你寫個(gè)函數(shù)就是為了調(diào)用一次?問(wèn)題就出在static±?/Z幫忙分析一下#include<iostream.h>#include<string.h>#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<memory.h>typedefstructAA(intb1:5;intb2:2;}AA;voidmain()AAaa;charcc[100];strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");memcpy(&aa,cc,sizeof(AA));cout<<aa.bl<<endl;cout<<aa.b2<<endl;)答案是-16和1首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.經(jīng)過(guò)strcpy和memcpy后,aa的4個(gè)字節(jié)所存放的值是:0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011所以,最后一步:顯示的是這4個(gè)字節(jié)的前5位,和之后的2位分別為:10000,和01因?yàn)?nt是有正負(fù)之分 所以:答案是ー16和1求函數(shù)返回值,輸入x=9999;intfunc(x)(intcountx=0;while(x)(countx++;x=x&(x-1);)returncountx;)結(jié)果呢?知道了這是統(tǒng)計(jì)9999的二進(jìn)制數(shù)值中有多少個(gè)1的函數(shù),且有9999=9x1024+512+256+159x1024中含有1的個(gè)數(shù)為2;512中含有1的個(gè)數(shù)為1;256中含有1的個(gè)數(shù)為1;15中含有1的個(gè)數(shù)為4;故共有1的個(gè)數(shù)為8,結(jié)果為8。1000-1=0111,正好是原數(shù)取反。這就是原理。用這種方法來(lái)求1的個(gè)數(shù)是很效率很高的。不必去ー個(gè)ー個(gè)地移位。循環(huán)次數(shù)最少。inta,b,c請(qǐng)寫函數(shù)實(shí)現(xiàn)C=a+b,不可以改變數(shù)據(jù)類型,如將c改為longint,關(guān)鍵是如何處理溢出問(wèn)題booladd(inta,intb,int*c)(*c=a+b;return(a>0&&b>0&&(*c<a11*c<b)11(a<0&&b<0&&(*c>a11*c>b)));)分析:structbit{inta:3;intb:2;intc:3;);intmain()(bits;char*c=(char*)&s;cout<<sizeof(bit)<<endl;*c=0x99;cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;inta=-1;prin廿("%x",a);return0;}輸出為什么是4-1-4ffffffff因?yàn)?x99在內(nèi)存中表示為10011001,a=001,b=11,c=100當(dāng)c為有符合數(shù)時(shí),c=100,最高1為表示c為負(fù)數(shù),負(fù)數(shù)在計(jì)算機(jī)用補(bǔ)碼表示,所以C=-4;同理b=-1當(dāng)c為有符合數(shù)時(shí),c=100,即c=4,同理b=3位域:有些信息在存儲(chǔ)時(shí),并不需要占用ー個(gè)完整的字節(jié),而只需占幾個(gè)或ー個(gè)二進(jìn)制位。例如在存放ー個(gè)開(kāi)關(guān)量時(shí),只有。和1兩種狀態(tài),用一位二進(jìn)位即可。為了節(jié)省存儲(chǔ)空間,并使處理簡(jiǎn)便,C語(yǔ)言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把ー個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說(shuō)明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個(gè)不同的對(duì)象用一個(gè)字節(jié)的二進(jìn)制位域來(lái)表示。ー、位域的定義和位域變量的說(shuō)明位域定義與結(jié)構(gòu)定義相仿,其形式為:struct位域結(jié)構(gòu)名{位域列表};其中位域列表的形式為:類型說(shuō)明符位域名:位域長(zhǎng)度例如:structbs(inta:8;intb:2;intc:6;};位域變量的說(shuō)明與結(jié)構(gòu)變量說(shuō)明的方式相同??刹捎孟榷x后說(shuō)明,同時(shí)定義說(shuō)明或者直接說(shuō)明這三種方式。例如:structbs(inta:8;intb:2;intc:6;}data;說(shuō)明data為bs變量,共占兩個(gè)字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。對(duì)于位域的定義尚有以下幾點(diǎn)說(shuō)明:.ー個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。如一個(gè)字節(jié)所??臻g不夠存放另一位域時(shí),應(yīng)從下一單元起存放該位域。也可以有意使某位域從下ー單元開(kāi)始。例如:structbs(unsigneda:4unsigned:0/*空域?/unsignedb:4/?從下ー單元開(kāi)始存放?/unsignedc:4在這個(gè)位域定義中,a占第一字節(jié)的4位,后4位填〇表示不使用,b從第二字節(jié)開(kāi)始,占用4位,c占用4位。.由于位域不允許跨兩個(gè)字節(jié),因此位域的長(zhǎng)度不能大于一個(gè)字節(jié)的長(zhǎng)度,也就是說(shuō)不能超過(guò)8位二進(jìn)位。.位域可以無(wú)位域名,這時(shí)它只用來(lái)作填充或調(diào)整位置。無(wú)名的位域是不能使用的。例如:structk(inta:1int:2/?該2位不能使用?/intb:3intc:2);從以上分析可以看出,位域在本質(zhì)上就是ー種結(jié)構(gòu)類型,不過(guò)其成員是按二進(jìn)位分配的。二、位域的使用位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為:位域變量名?位域名位域允許用各種格式輸出。main(){structbs(unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit;bit.a=1;bit.b=7;bit.c=15;pri改錯(cuò):#include<stdio.h>intmain(void){int**p;intarr[100];p=&arr;return0;解答:搞錯(cuò)了,是指針類型不同,int**p;〃二級(jí)指針&arrJ〃得到的是指向第一維為100的數(shù)組的指針#include<stdio.h>intmain(void){int**p,*q;intarr[100];q=arr;p=&q;return0;)下面這個(gè)程序執(zhí)行后會(huì)有什么錯(cuò)誤或者效果:#defineMAX255intmain()(unsignedcharA[MAX],i;//i被定義為unsignedcharfor(i=0;i<=MAX;i++)A[i]=i;)解答:死循環(huán)加數(shù)組越界訪問(wèn)(C/C++不進(jìn)行數(shù)組越界檢查)MAX=255數(shù)組A的下標(biāo)范圍為:0..MAX-1,這是其ー..其二.當(dāng)i循環(huán)到255時(shí),循環(huán)內(nèi)執(zhí)行:A[255]=255;這句本身沒(méi)有問(wèn)題..但是返回for(i=0;i<=MAX;i++)語(yǔ)句時(shí),由于unsignedchar的取值范圍在(〇..255),i++以后i又為0了..無(wú)限循環(huán)下去.structnamel{charstr;shortx;intnum;structname2{charstr;intnum;shortx;sizeof(structnamel)=8,sizeof(structname2)=12在第二個(gè)結(jié)構(gòu)中,為保證num按四個(gè)字節(jié)對(duì)齊,char后必須留出3字節(jié)的空間;同時(shí)為保證整個(gè)結(jié)構(gòu)的自然對(duì)齊(這里是4字節(jié)對(duì)齊),在x后還要補(bǔ)齊2個(gè)字節(jié),這樣就是12字節(jié)。intel:A.c和B.c兩個(gè)c文件中使用了兩個(gè)相同名字的static變量,編譯的時(shí)候會(huì)不會(huì)有問(wèn)題?這兩個(gè)static變量會(huì)保存到哪里(棧還是堆或者其他的)?static的全局變量,表明這個(gè)變量?jī)H在本模塊中有意義,不會(huì)影響其他模塊。他們都放在數(shù)據(jù)區(qū),但是編譯器對(duì)他們的命名是不同的。如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。structs1(inti:8;intj:4;inta:3;doubleb;);structs2(inti:8;intj:4;doubleb;inta:3;);printf("sizeof(s1)=%d\n",sizeof(s1));printf("sizeof(s2)=%d\n",sizeof(s2));result:16,24第一個(gè)structs1(inti:8;intj:4;inta:3;doubleb;};理論上是這樣的,首先是i在相對(duì)〇的位置,占8位ー個(gè)字節(jié),然后,j就在相對(duì)ー個(gè)字節(jié)的位置,由于ー個(gè)位置的字節(jié)數(shù)是4位的倍數(shù),因此不用對(duì)齊,就放在那里了,然后是a,要在3位的倍數(shù)關(guān)系的位置上,因此要移ー位,在15位的位置上放下,目前總共是18位,折算過(guò)來(lái)是2字節(jié)2位的樣子,由于double是8字節(jié)的,因此要在相對(duì)〇要是8個(gè)字節(jié)的位置上放下,因此從18位開(kāi)始到8個(gè)字節(jié)之間的位置被忽略,直接放在8字節(jié)的位置了,因此,總共是16字節(jié)。第二個(gè)最后會(huì)對(duì)照是不是結(jié)構(gòu)體內(nèi)最大數(shù)據(jù)的倍數(shù),不是的話,會(huì)補(bǔ)成是最大數(shù)據(jù)的倍數(shù)1)讀文件fileLtxt的內(nèi)容(例如):123456輸出到file2.txt:563412(逆序)2)輸出和為ー個(gè)給定整數(shù)的所有組合例如n=55=1+4;5=2+3(相加的數(shù)不能重復(fù))則輸出1,4;2,3〇1、用指針的方法,將字符串“ABCD1234efgh”前后對(duì)調(diào)顯示include<stdio.h>include<string.h>include<dos.h>intmain()(charstr[]="ABCD1234efgh";intlength=strlen(str);char*p1=str;char*p2=str+length-1;while(p1<p2)(charc=*p1;p1=*p2;p2=c;++p1;p2;}printf("strnowis%s\n",str);system("pause");return0;有一分?jǐn)?shù)序列:1/2,1/4,1/6,1/8……,用函數(shù)調(diào)用的方法,求此數(shù)列前項(xiàng)的和include<stdio.h>doublegetValue()(doubleresult=0;inti=2;while(i<42)(result+=1.0/i;〃一定要使用1.0做除數(shù),不能用1,否則結(jié)果將自動(dòng)轉(zhuǎn)化成整數(shù),即〇.〇〇〇〇〇〇i+=2;)returnresult;)intmain()(printf("resultis%f\n",getValue());system("pause");return0;)11.寫ー個(gè)函數(shù)比較兩個(gè)字符串str1和str2的大小,若相等返回〇,若str1大于str2返回1,若str1小于str2返回ー1intstrcmp(constchar*src,constchar*dst)(intret=0;while(!(ret=*(unsignedchar*)src-*(unsignedchar*)dst)&&*dst)(++src;++dst;}if(ret<0)ret=-1;elseif(ret>0)ret=1;return(ret);斐波拉契數(shù)列遞歸實(shí)現(xiàn)的方法如下:intFunct(intn)if(n==0)return1;if(n==1)return1;retrurnFunct(n-1)+Funct(n-2);}請(qǐng)問(wèn),如何不使用遞歸,來(lái)實(shí)現(xiàn)上述函數(shù)?請(qǐng)教各位高手!解答:intFunct(intn)//n為非負(fù)整數(shù)(inta=0;intb=1;intc;if(n==0)c=1;elseif(n==1)c=1;elsefor(inti=2;iv=n;i++)〃應(yīng)該n從2開(kāi)始算起(c=a+b;a=b;b=c;)returnc;)解答.現(xiàn)在大多數(shù)系統(tǒng)都是將低字位放在前面,而結(jié)構(gòu)體中位域的申明一般是先聲明高位。100的二進(jìn)制是001100100低位在前高位在后001---S3100---S2100——s1所以結(jié)果應(yīng)該是1如果先申明的在低位則:001---S1100---S2100---S3結(jié)果是41、原題跟little-endian,big-endian沒(méi)有關(guān)系2、原題跟位域的存儲(chǔ)空間分配有關(guān),到底是從低字節(jié)分配還是從高字節(jié)分配,從DevC++和VC7.1上看,都是從低字節(jié)開(kāi)始分配,并且連續(xù)分配,中間不空,不像譚的書(shū)那樣會(huì)留空位3、原題跟編譯器有關(guān),編譯器在未用堆棧空間的默認(rèn)值分配上有所不同,DevC++未用空間分配為01110111b,VC7.1下為11001100b,所以在DevC++下的結(jié)果為5,在VC7.1下為1。注:PC一般采用little-endian,即高高低低,但在網(wǎng)絡(luò)傳輸上,一般采用big-endian,即高低低高,華為是做網(wǎng)絡(luò)的,所以可能考慮big-endian模式,這樣輸出結(jié)果可能為4判斷ー個(gè)字符串是不是回文intlsReverseStr(char*aStr)(inti,j;intfound=1;if(aStr==NULL)return-1;j=strlen(aStr);for(i=0;i<j/2;i++)if(*(aStr+i)!=*(aStr+j-i-1))(found=0;break;)returnfound;5.用變量a給出下面的定義ー個(gè)整型數(shù)(Aninteger)ー個(gè)指向整型數(shù)的指針(Apointertoaninteger)ー個(gè)指向指針的的指針,它指向的指針是指向ー個(gè)整型數(shù)(Apointertoapointertoaninteger)ー個(gè)有!0個(gè)整型數(shù)的數(shù)組(Anarrayof10integers)ー個(gè)有10個(gè)指針的數(shù)組,該指針是指向ー個(gè)整型數(shù)的(Anarrayof10pointerstointegers)ー個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回~>個(gè)整型數(shù)(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:inta;//Anintegerint*a;//Apointertoanintegerint**a;//Apointertoapointertoanintegerinta[10];//Anarrayof10integersint*a[10];//Anarrayof10pointerstointegersint(*a)[10];//Apointertoanarrayof10integersint(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanintegerint(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger人們經(jīng)常聲稱這里有幾個(gè)問(wèn)題是那種要翻一下書(shū)才能回答的問(wèn)題,我同意這種說(shuō)法。當(dāng)我寫這篇文章時(shí),為了確定語(yǔ)法的正確性,我的確查了一下書(shū)。但是當(dāng)我被面試的時(shí)候,我期望被問(wèn)到這個(gè)問(wèn)題(或者相近的問(wèn)題)。因?yàn)樵诒幻嬖嚨倪@段時(shí)間里,我確定我知道這個(gè)問(wèn)題的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答案),那么也就沒(méi)有為這次面試做準(zhǔn)備,如果該面試者沒(méi)有為這次面試做準(zhǔn)備,那么他又能為什么出準(zhǔn)備呢?Static.關(guān)鍵字static的作用是什么?這個(gè)簡(jiǎn)單的問(wèn)題很少有人能回答完全。在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用:.在函數(shù)體,ー個(gè)被聲明為靜態(tài)的變量在這ー函數(shù)被調(diào)用過(guò)程中維持其值不變2),在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是ー個(gè)本地的全局變量。3),在模塊內(nèi),ー個(gè)被聲明為靜態(tài)的函數(shù)只可被這ー模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是ー個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。Const.關(guān)鍵字const是什么含意?我只要一聽(tīng)到被面試者說(shuō):“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。去年DanSaks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:EmbeddedSystemsProgramming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒(méi)有讀到那篇文章,只要能說(shuō)出const意味著“只讀”就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為ー個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個(gè)問(wèn)題,我將問(wèn)他ー個(gè)附加的問(wèn)題:下面的聲明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;前兩個(gè)的作用是ー樣,a是ー個(gè)常整型數(shù)。第三個(gè)意味著a是ー個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后ー個(gè)意味著a是ー個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問(wèn)題,那么他就給我留下了一個(gè)好印象。順帶提一句,也許你可能會(huì)問(wèn),即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:1).關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的。)2),通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。3),合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。Volatile8.關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯寫兩段代碼,第一個(gè)設(shè)置a的bit3,第二個(gè)清除a的bit3〇在以上兩個(gè)操作中,要保持其它位不變。.什么是“引用”?申明和使用“引用”要注意哪些問(wèn)題?答:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對(duì)應(yīng)用的操作與對(duì)變量直接操作效果完全相同。申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該冃標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的ー個(gè)別名,它本身不是ー種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用。.將“引用”作為函數(shù)參數(shù)有哪些特點(diǎn)?(1)傳遞引用給函數(shù)與傳遞指針的效果是ー樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來(lái)主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮末`個(gè)別名來(lái)使用,所以在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒(méi)有產(chǎn)生實(shí)參的副本,它是直接對(duì)實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給形參分配存儲(chǔ)單元,形參變量是實(shí)參變量的副本;如果傳遞的是對(duì)象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲(chǔ)單元,且需要重復(fù)使用"?指針變量名"的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差:另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。而引用更容易使用,更清晰。.在什么時(shí)候需要使用“常引用‘?如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。常引用聲明方式:const類型標(biāo)識(shí)符&引用名=目標(biāo)變量名:例1inta;constint&ra=a;ra=1;/Z錯(cuò)誤a=1J〃正確例2stringfoo();voidbar(string&s);那么下面的表達(dá)式將是非法的:bar(foo());bar("helloworld");原因在于foo()和"helloworld”串都會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象,而在C++中,這些臨時(shí)對(duì)象都是const類型的。因此上面的表達(dá)式就是試圖將一個(gè)const類型的對(duì)象轉(zhuǎn)換為非const類型,這是非法的。引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const。.將“引用”作為函數(shù)返回值類型的格式、好處和需要遵守的規(guī)則?格式:類型標(biāo)識(shí)符&函數(shù)名(形參列表及類型說(shuō)明){〃函數(shù)體}好處:在內(nèi)存中不產(chǎn)生被返回值的副本;(注意:正是因?yàn)檫@點(diǎn)原因,所以返回一個(gè)局部變量的引用是不可取的。因?yàn)殡S著該局部變量生存期的結(jié)朿,相應(yīng)的引用也會(huì)失效,產(chǎn)生runtimeerror!注意事項(xiàng):(1)不能返回局部變量的引用。這條可以參照EffectiveC++⑴的Item31。主要原因是局部變量會(huì)在函數(shù)返回后被銷毀,因此被返回的引用就成為了“無(wú)所指”的引用,程序會(huì)進(jìn)入未知狀態(tài)。(2)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用.這條可以參照EffectiveC++。]的Item31〇雖然不存在局部變量的被動(dòng)銷毀問(wèn)題,可對(duì)于這種情況(返回函數(shù)內(nèi)部new分配內(nèi)存的引用),又面臨其它尷尬局面。例如,被函數(shù)返回的引用只是作為ー個(gè)臨時(shí)變量出現(xiàn),而沒(méi)有被賦予ー個(gè)實(shí)際的變量,那么這個(gè)引用所指向的空間(由new分配)就無(wú)法釋放,造成memoryleak。(3)可以返回類成員的引用,但最好是const?這條原則以參照EffectiveC++[1]的Item30。主要原因是當(dāng)對(duì)象的屬性是與某種業(yè)務(wù)規(guī)則(businessrule)相關(guān)聯(lián)的時(shí)候,其賦值常常與某些其它屬性或者對(duì)象的狀態(tài)有關(guān),因此有必要將賦值操作封裝在ー個(gè)業(yè)務(wù)規(guī)則當(dāng)中。如果其它對(duì)象可以獲得該屬性的非常量引用(或指針),那么對(duì)該屬性的單純賦值就會(huì)破壞業(yè)務(wù)規(guī)則的完整性。(4)流操作符重載返回值申明為“引用”的作用:流操作符<<和>>,這兩個(gè)操作符常常希望被連續(xù)使用,例如:cout<<"hello"<<endl;因此這兩個(gè)操作符的返冋值應(yīng)該是ー個(gè)仍然支持這兩個(gè)操作符的流引用??蛇x的其它方案包括:返回一個(gè)流對(duì)象和返回一個(gè)流對(duì)象指針。但是對(duì)于返回一個(gè)流對(duì)象,程序必須重新(拷貝)構(gòu)造一個(gè)新的流對(duì)象.也就是說(shuō),連續(xù)的兩個(gè)<<操作符實(shí)際I:是針對(duì)不同對(duì)象的!這無(wú)法讓人接受。對(duì)于返回一個(gè)流指針則不能連續(xù)使用<<操作符。因此,返回一個(gè)流對(duì)象引用是惟一選擇。這個(gè)唯一選擇很關(guān)鍵,它說(shuō)明了引用的重要性以及無(wú)可替代性,也許這就是C++語(yǔ)言中引入引用這個(gè)概念的原因吧。賦值操作符=。這個(gè)操作符象流操作符ー樣,是可以連續(xù)使用的,例如:x=j=10;或者(x=10)=10〇;賦值操作符的返回值必須是一個(gè)左值,以便可以被繼續(xù)賦值。因此引用成了這個(gè)操作符的惟ー返回值選擇。例3#include<iostream,h>int&put(intn);intvals[10];interror=-1;voidmain(){put(0)=10;〃以put(O)函數(shù)值作為左值,等價(jià)于vals⑼=10;put(9)=20;〃以put(9)函數(shù)值作為左值,等價(jià)于vals[9]=20;cout<<vals[0];cout<<vals[9];)int&put(intn){if(n>=0&&n<=9)returnvals[n];else{coutvv"subscripterror";returnerror;}(5)在另外的一些操作符中,卻千萬(wàn)不能返回引用:+?*/四則運(yùn)算符。它們不能返回引用,日f(shuō)ectiveC++[1]的Item23詳細(xì)的討論了這個(gè)問(wèn)題。主要原因是這四個(gè)操作符沒(méi)有sideeffect,因此,它們必須構(gòu)造ー個(gè)對(duì)象作為返回值,可選的方案包括:返回一個(gè)對(duì)象、返回一個(gè)局部變量的引用,返回一個(gè)new分配的對(duì)象的引用、返回一個(gè)靜態(tài)對(duì)象引用。根據(jù)前面提到的引用作為返回值的三個(gè)規(guī)則,第2、3兩個(gè)方案都被否決了。靜態(tài)對(duì)象的引用又因?yàn)?(a+b)==(c+d))會(huì)永遠(yuǎn)為true而導(dǎo)致錯(cuò)誤。所以可選的只剩下返回一個(gè)對(duì)象了。.“引用”與多態(tài)的關(guān)系?引用是除指針外另ー個(gè)可以產(chǎn)生多態(tài)效果的手段。這意味著,一個(gè)基類的引用可以指向它的派生類實(shí)例。例4ClassA;ClassB:ClassA{...};Bb;A&ref=b;.“引用”與指針的區(qū)別是什么?指針通過(guò)某個(gè)指針變量指向ー個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別。.什么時(shí)候需要“引用”?流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用。以上2-8參考:/wfwd/archive/2006/05/30/763551.aspx.結(jié)構(gòu)與聯(lián)合有和區(qū)別?.結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成,但在任何同一時(shí)刻,聯(lián)合中只存放了一個(gè)被選中的成員(所有"成員共用ー塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。.對(duì)于聯(lián)合的不同成員賦值,將會(huì)對(duì)其它成員重寫,原來(lái)成員的值就不存在了,而對(duì)于結(jié)構(gòu)的不同成員賦值是互不影響的。11.已知strcpy的函數(shù)原型:char*strcpy(char*strDest,constchar*sfrSrcノ其中strDest是目的字符串,strSrc是源字符串。不調(diào)用C++/C的字符串庫(kù)函數(shù),請(qǐng)編寫函數(shù)strcpy.答案:char*strcpy(char*strDest,constchar*strSrc)(if(strDest==NULL||strSrc==NULL)returnNULL;if(strDest==strSrc)returnstrDest;char*tempptr=strDest;while((*strDest++=*strSrc++)!=*\0')returntempptr;12.已知String類定義如下:classString(public:String(constchar*str=NULL);//通用構(gòu)造函數(shù)String(constString&another);/Z拷貝構(gòu)造函數(shù)?String();/Z析構(gòu)函數(shù)String&operater=(constString&rhs);II賦值函數(shù)private:char*m_data;/Z用于保存字符串);嘗試寫出類的成員函數(shù)實(shí)現(xiàn)。答案:String::String(constchar*str)(if(str==NULL)〃strlen在參數(shù)為NULL時(shí)會(huì)拋異常オ會(huì)有這步判斷(m_data=newchar[1];m_data[0]='\0';)else(m_data=newchar[strlen(str)+1];strcpy(m_data,str);String::String(constString&another)(m_data=newchar[strlen(another.m_data)+1];strcpy(m_data,other.m_data);String&String::operator=(constString&rhs)if(this==&rhs)return*this;delete[]m_data;//刪除原來(lái)的數(shù)據(jù),新開(kāi)ー塊內(nèi)存m_data=newchar[strlen(rhs.m_data)+1];strcpy(m_data,rhs.m_data);return*this;String:String()(delete[]m_data;.關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?涉及到UML中的ー些概念:關(guān)聯(lián)是表示兩個(gè)類的一般性聯(lián)系,比如“學(xué)生”和“老師”就是ー種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是ー種相對(duì)松散的關(guān)系,聚合類不需要對(duì)被聚合類負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:ClassA CIbmB 0從實(shí)現(xiàn)的角度講,聚合可以表示為:classA{...}classB{A*a; }而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類與被組合類有相同的生命周期,組合類要對(duì)被組合類負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)系:實(shí)現(xiàn)的形式是:classA{...}classB{Aa;...).面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之?.封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,public).繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無(wú)需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。前兩種(類繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。.多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō),就是一句話:允許將子類類型的指針賦值給父類類型的指針。.#defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?答案:i為30。C++是不是類型安全的?答案:不是。兩個(gè)不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)。C#是類型安全的。main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在main函數(shù)之前執(zhí)行。27.struct和class的區(qū)別答案:struct的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的。struct和class在其他方面是功能相當(dāng)?shù)?。從感情上講,大多數(shù)的開(kāi)發(fā)者感到類和結(jié)構(gòu)有很大的差別。感覺(jué)上結(jié)構(gòu)僅僅象ー堆缺乏封裝和功能的開(kāi)放的內(nèi)存位,而類就象活的并且可靠的社會(huì)成員,它有智能服務(wù),有牢固的封裝屏障和一個(gè)良好定義的接口。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)時(shí),你也許應(yīng)該使用struct關(guān)鍵字,否則,你應(yīng)該使用class關(guān)鍵字。28.當(dāng)ー個(gè)類A中沒(méi)有生命任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值是多少,如果不是零,請(qǐng)解釋一下編譯器為什么沒(méi)有讓它為零。(Autodesk)答案:肯定不是零。舉個(gè)反例,如果是零的話,聲明一個(gè)classA[10]對(duì)象數(shù)組,而每ー個(gè)對(duì)象占用的空間是零,這時(shí)就沒(méi)辦法區(qū)分A[0],A[1]…了。.比較C++中的4種類型轉(zhuǎn)換方式?請(qǐng)參考:/wfwd/archive/2006/05/30/763785.aspx,重點(diǎn)是static_cast,dynamic_cast和reinterpret_cast的區(qū)別和應(yīng)用。.分別寫出BOOL,int,float,指針類型的變量a與“零”的比較語(yǔ)句。答案:BOOL:if(!a)orif(a)int:if(a==0)float:constEXPRESSIONEXP=0.000001if(a<EXP&&a>-EXP)pointer:if(a!=NULL)orif(a==NULL).請(qǐng)說(shuō)出const與#define相比,有何優(yōu)點(diǎn)?答案:1)const常量有數(shù)據(jù)類型,而宏常量沒(méi)有數(shù)據(jù)類型。編譯器可以對(duì)前者進(jìn)行類型安全檢査。而對(duì)后者只進(jìn)行字符替換,沒(méi)有類型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤。2)有些集成化的調(diào)試工具可以對(duì)const常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。.簡(jiǎn)述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意類型的內(nèi)存塊。(1)修改內(nèi)容上的差別charaロ="hello”;a[0]=二’;char*p="world”;〃注意p指向常量字符串p[0]='X';〃編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤(2)用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是ー個(gè)指針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量。C++/C語(yǔ)言沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請(qǐng)內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類型的指針。charaQ="helloworld";char*p=a;cout?sizeof(a)?endl;//12字節(jié)cout?sizeof(p)?endl;//4字節(jié)計(jì)算數(shù)組和指針的內(nèi)存容量voidFunc(chara[100])(cout?sizeof(a)?endl;//4字節(jié)而不是100字節(jié).類成員函數(shù)的重載、覆蓋和隱藏區(qū)別?答案:a.成員函數(shù)被重載的特征:(1)相同的范圍(在同一個(gè)類中):(2)函數(shù)名字相同;(3)參數(shù)不同;virtua!關(guān)鍵字可有可無(wú)。b.覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:(1)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual關(guān)鍵字。c.“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆).Therearetwointvariables:aandb,don*tuse"if","?:","switch"orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.答案:((a+b)+abs(a-b))/2.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?答案:cout?_FILE_;cout?_LINE_;_FILE_和_LINE_是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的,而是由編譯器定義的。.main主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說(shuō)明?答案:可以,可以用—onexit注冊(cè)ー個(gè)函數(shù),它會(huì)在main之后執(zhí)行intfn1(void),fn2(void),fn3(void),fn4(void);voidmain(void){Stringstr("zhanglin");_onexit(fn1);_onexit(fn2);_onexit(fn3);_onexit(fn4);printf("ThisisexecutedfirstAn");}intfn1(){printf("nextAn");return0;}intfn2()(printf("executed");return0;intfn3()printf("is");return0;}intfn4()printf("This");return0;}The_onexitfunctionispassedtheaddressofafunction(func)tobecalledwhentheprogramterminatesnormally.Successivecallsto_onexitcreatearegisteroffunctionsthatareexecutedinLIFO(last-in-first-out)order.Thefunctionspassedto_onexitcannottakeparameters..如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?答案:#ifdef_cpluspluscout?"c++";#elsecout?"c";#endif.文件中有一組整數(shù),要求排序后輸出到另ー個(gè)文件中答案:#include<iostream>#include<fstream>usingnamespacestd;voidOrder(vector<int>&data)//bubblesort(intcount=data.size();inttag=false;//設(shè)置是否需要繼續(xù)冒泡的標(biāo)志位for(inti=0;i<count;i++)(for(intj=0;j<count-i-1;j++){if(data[j]>data[j+1])tag=true;inttemp=data[j];datafj]=data[j+1];data[j+1]=temp;if(!tag)break;voidmair)(void)(vector<int>data;ifstreamin("c:\\data.txt");if(lin)(cout?"fileerror!";exit(1);}inttemp;while(!in.eof())(in?temp;data.push_back(temp);}inclose。;〃關(guān)閉輸入文件流Order(data);ofstreamout("c:\\result.txt");if(lout){cout?"fileerror!";exit(1);)for(i=0;i<data.size。;i++)out?data[i]?"";out.close。;〃關(guān)閉輸出文件流.鏈表題:ー個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)structNodeintdata;Node*next;};typedefstructNodeNode;⑴已知鏈表的頭結(jié)點(diǎn)head,寫ー個(gè)函數(shù)把這個(gè)鏈表逆序(Intel)Node*ReverseList(Node*head)//鏈表逆序(if(head==NULL||head->next==NULL)returnhead;Node*p1=head;Node*p2=p1->next;Node*p3=p2->next;p1->next=NULL;while(p3!=NULL)(p2->next=p1;p1=p2;p2=p3;p3=p3->next;}p2->next=p1;head=p2;returnhead;)⑵已知兩個(gè)鏈表headl和head2各自有序,請(qǐng)把它們合并成

溫馨提示

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

評(píng)論

0/150

提交評(píng)論