




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++筆試面試1000題
1.什么是“引用”?申明和使用“引用”要注意哪些問(wèn)題?
答:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對(duì)應(yīng)用的操作與對(duì)變量直接操作
效果完全相同。申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化。引用聲明完畢后,
相當(dāng)于目標(biāo)變量名有兩個(gè)名稱(chēng),即該目標(biāo)原名稱(chēng)和引用名,不能再把該引用名作
為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用
名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類(lèi)型,因此引用本身不占存儲(chǔ)
單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用。
2.指針和引用的區(qū)別?
答:引用是在C++中引入的。它們之間的區(qū)別有:
(1)非空區(qū)別:指針可以為空,而引用不能為空
(2)可修改區(qū)別:如果指針不是常指針,那么就可以修改指向,而引用不能
(3)初始化區(qū)別:指針定義時(shí)可以不初始化,而引用在定義的時(shí)必須初始化
3、為什么構(gòu)造函數(shù)不能聲明為虛函數(shù)?
答:因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,虛調(diào)用是指允許在只知道部分信息的情
況下的工作機(jī)制,特別允許我們調(diào)用一個(gè)只知道接口而不知道其對(duì)象的準(zhǔn)確類(lèi)型
的函數(shù)。但是如果我們要調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),必須要知道對(duì)象的準(zhǔn)確類(lèi)型,
因此構(gòu)造函數(shù)不能為虛函數(shù)。
4.charstrl[]=wabc”;charstr2[]="abc";strl==str2為FALSE,因?yàn)閟trl
和str2是位于堆棧上的,它們占用不同的內(nèi)存空間。Constcharstr3[]="abc";
constcharstr4[]="abc";str3==str4為FALSE,同樣它們是位于堆棧上的內(nèi)存空
間,是不同的。Constchar*str5="abc”,constchar*str6="abc";char
*str7="abc",char*str8="abc",str5==str6str7==str8為T(mén)RUE,因?yàn)椤癮bc”是位
于文字常量區(qū)的,系統(tǒng)會(huì)將兒個(gè)“abc”進(jìn)行優(yōu)化,使它們位于同一塊內(nèi)存區(qū),因
此指針的指向也就相同了。
5.以下函數(shù)能求出數(shù)組的長(zhǎng)度嗎?
voidfun(charstr[]){intlen=sizeof(str)/sizeof(str[0]);}
答:不能,數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組名被退化為指針,因此函數(shù)中的
sizeof(str)實(shí)際是在求一個(gè)指針的sizeof,答案為4,因此不能計(jì)算出數(shù)組的長(zhǎng)度。
6.類(lèi)的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?
答:類(lèi)的靜態(tài)成員每個(gè)類(lèi)只有一個(gè),靜態(tài)成員為所有類(lèi)的實(shí)例對(duì)象共享,靜態(tài)成
員有靜態(tài)成員變量和靜態(tài)成員函數(shù),靜態(tài)成員變量使用前必須初始化,靜態(tài)成員
變量可以被靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)訪問(wèn),而靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)
成員變量,因?yàn)殪o態(tài)成員函數(shù)屬于類(lèi),其沒(méi)有this指針。非靜態(tài)成員每個(gè)對(duì)象都
有一個(gè)。
7.static的有什么作用(包括在類(lèi)中)?
答:(1)函數(shù)體內(nèi)的靜態(tài)變量,其值在函數(shù)的調(diào)用過(guò)程中保持不變。跟局部變量
的區(qū)別。
(2)在函數(shù)體外定義的靜態(tài)變量,限制了它的使用范圍只在于該子模塊,該
子模塊內(nèi)的函數(shù)都能訪問(wèn)它,但是子模塊外不能訪問(wèn),實(shí)際就類(lèi)似于是一個(gè)本地
的全局變量。與一般全局變量的區(qū)別。
(3)類(lèi)的靜態(tài)成員函數(shù)。
本質(zhì)上來(lái)說(shuō),static就是聲明了對(duì)象的生成期,限制了對(duì)象的作用域。
或(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的
內(nèi)存只能被分配一次,因此其值在下次函數(shù)調(diào)用時(shí)仍維持上次的值。
(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問(wèn),但不能被模塊
外其他函數(shù)訪問(wèn)。
(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個(gè)函數(shù)的使
用范圍被限制在聲明它的模塊。
(4)在類(lèi)中的static成員變量屬于整個(gè)類(lèi)所有,對(duì)類(lèi)的所有對(duì)象只有一份拷貝。
(5)在類(lèi)中的static成員函數(shù)屬于整個(gè)類(lèi)所有,這個(gè)函數(shù)不接受this指針,因
而只能訪問(wèn)類(lèi)的static成員變量。
8.寫(xiě)程序,將一個(gè)字符串倒序?
答:直接在main函數(shù)中實(shí)現(xiàn)的
voidmain()
{
char*source="hello";
char*des;
intlen=strlen(source);
des=(char*)malloc(len+l);〃申請(qǐng)空間必須是len+1,力口1是為了放結(jié)束符
if(!des){exit(l);}
char*s=&source[len-l];
char*d=des;
while(len—!=0){*d++=*s—;}
*d='\0';//必須要
cout?source?endl;
cout?des?endl;}
9.在C++程序中調(diào)用C編譯后的函數(shù),為什么要加externC的聲明?
答:因?yàn)镃++支持函數(shù)重載,而C不支持函數(shù)重載。函數(shù)被C++編譯后在庫(kù)中的
名字與C語(yǔ)言的不同。假設(shè)某個(gè)函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C
編譯器編譯后在庫(kù)中的名字為_(kāi)f。。,而C++編譯器則產(chǎn)生像_foo_int_int之類(lèi)的名
字。C++提供了C連接交換指定符號(hào)externC來(lái)解決名字匹配問(wèn)題。
10.C++中哪些函數(shù)不能被聲明為虛函數(shù)?
答:普通函數(shù)(非成員函數(shù)),構(gòu)造函數(shù),內(nèi)聯(lián)成員函數(shù)、靜態(tài)成員函數(shù)、友元函
數(shù)。
(1)虛函數(shù)用于基類(lèi)和派生類(lèi),普通函數(shù)所以不能
(2)構(gòu)造函數(shù)不能是因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,允許在只知道部分信息
的情況的工作機(jī)制,特別允許調(diào)用只知道接口而不知道對(duì)象的準(zhǔn)確類(lèi)型的方法,
但是調(diào)用構(gòu)造函數(shù)即使要?jiǎng)?chuàng)建一個(gè)對(duì)象,那勢(shì)必要知道對(duì)象的準(zhǔn)確類(lèi)型。
(3)內(nèi)聯(lián)成員函數(shù)的實(shí)質(zhì)是在調(diào)用的地方直接將代碼擴(kuò)展開(kāi)
(4)繼承時(shí),靜態(tài)成員函數(shù)是不能被繼承的,它只屬于一個(gè)類(lèi),因?yàn)橐膊淮嬖趧?dòng)
態(tài)聯(lián)編等
(5)友元函數(shù)不是類(lèi)的成員函數(shù),因此也不能被繼承
ll.include<filename.h>^Dinclude<<filename.hM的區(qū)別?
答:<>是從標(biāo)準(zhǔn)庫(kù)路徑搜索,是從用戶(hù)當(dāng)前工作目錄開(kāi)始,找不到,在到標(biāo)
準(zhǔn)庫(kù)開(kāi)始
12.編寫(xiě)strlen函數(shù),編寫(xiě)strcpy函數(shù)
答:
intStrlen(constchar*str){
intlen=0;
assert(str!=NULL);
while(*str++!=*\0'){len++;}
returnlen;}
非空判斷是必須進(jìn)行的操作,可以使用斷言的方式assert(str)!=NULL才會(huì)繼續(xù)
char*StrCpy(char*strDes,constchar*strSrc){
assert((strDes!=NULL)&&(strSrc!=NULL));
char*address=strDes;
while((*strDes++=*strSrc++)!='\0');
returnaddress;}
首先必須判斷兩個(gè)指針是否為空,由于復(fù)制后的指針需要返回,因此需要一個(gè)指針來(lái)記錄地址的初始值,最
后將復(fù)制的結(jié)果返回是為了進(jìn)行鏈?zhǔn)讲僮鳌?/p>
13Heap和Stack的區(qū)別?
答:Heap是堆,Stack是棧。
棧的空間由操作系統(tǒng)自動(dòng)分配和回收,而堆上的空間由程序員申請(qǐng)和釋
放。
棧的空間大小較小,而堆的空間較大。
棧的地址空間往低地址方向生長(zhǎng),而堆向高地址方向生長(zhǎng)。
棧的存取效率更高。
程序在編譯期間對(duì)變量和函數(shù)的內(nèi)存分配都在棧上,
且程序運(yùn)行過(guò)程中對(duì)函數(shù)調(diào)用中參數(shù)的內(nèi)存分配也是在棧上。
14.輸出的結(jié)果是多少,并分析過(guò)程?
unsignedshortA=10;
printf("%u\n",~A);
charch=128;
printf(a%d\n”,ch);
答:~A=4294967285,首先將A轉(zhuǎn)化為int類(lèi)型,即對(duì)應(yīng)的二進(jìn)制數(shù)值為:00000000
000000000000000000001010,~A=11111111111111111111111111110101,其實(shí)這
種情況最高位是1,認(rèn)為是負(fù)數(shù),但是在輸出中指定以無(wú)符號(hào)數(shù)輸出,于是結(jié)果為
4294967285=4294967295(四字節(jié)表示的最大數(shù))-10.
ch=128對(duì)應(yīng)的二進(jìn)制為:10000000,在輸出中以整數(shù)形式輸出,由于最高位是1,
于是就是負(fù)數(shù),10000000是該負(fù)數(shù)的補(bǔ)碼,根據(jù)求補(bǔ)碼的反步驟計(jì)算,先-1,得到
01111111,在取反得10000000=128,由于本身是負(fù)數(shù),即為128.
15、sizeof和strlen之間的區(qū)別?
答:(1)sizeof操作符的結(jié)果類(lèi)型是size_t,它在頭文件中的typedef為unsignedint
類(lèi)型,該類(lèi)型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。
(2)sizeof是運(yùn)算符,strlen是函數(shù)
(3)sizeof可以用類(lèi)型做參數(shù),strlen只能用char*做參數(shù),且必須是
以‘\0'結(jié)尾的。
(4)數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針。
(5)大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過(guò)了,是類(lèi)型或是變量
的長(zhǎng)度。
(6)strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來(lái),用來(lái)計(jì)算字符串的長(zhǎng)度,
而不是類(lèi)型占用內(nèi)存的大小。
(7)sizeof后如果是類(lèi)型必須加括號(hào),如果是變量名可以不加括號(hào)。
(8)當(dāng)使用了一個(gè)結(jié)構(gòu)類(lèi)型或變量時(shí),sizeof返回實(shí)際的大小。
(9)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組
的首地址。
(10)計(jì)算結(jié)構(gòu)變量的大小就必須討論數(shù)組對(duì)齊問(wèn)題。
(11)sizeof操作符不能用于函數(shù)類(lèi)型,不完全類(lèi)型或位字段。
16.內(nèi)聯(lián)函數(shù)和宏的差別?
答:內(nèi)聯(lián)函數(shù)和普通函數(shù)相比可以加快程序運(yùn)行的速度,因?yàn)椴恍枰袛嗾{(diào)用,
在編譯的時(shí)候內(nèi)聯(lián)函數(shù)可以直接被鑲嵌到目標(biāo)代碼中,而宏只是一個(gè)簡(jiǎn)單的替換。
內(nèi)聯(lián)函數(shù)要做參數(shù)類(lèi)型檢查,這是與宏相比的優(yōu)勢(shì)。
Inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫(xiě)到
那里去。對(duì)于短小的代碼來(lái)說(shuō),inline可以帶來(lái)一定效率的提升,而且和C時(shí)代的
宏函數(shù)相比,inline更安全可靠。可是這是以增加空間消耗為代價(jià)的。
Inline一般只適用于:一個(gè)函數(shù)被不斷地重復(fù)調(diào)用;函數(shù)只有簡(jiǎn)單的兒行,且
函數(shù)內(nèi)不能含有forwhileswitch語(yǔ)句。
17.請(qǐng)找出下面代碼中的所以錯(cuò)誤
說(shuō)明:以下代碼是把一個(gè)字符串倒序,如“abed”倒序后變?yōu)椤癲eba”
Sinclude“string,h”
main(){
char*src="hello,world;
char*dest=NULL;
intlen=strlen(sre);
dest=(char*)malloc(len);
char*d=dest;
char*s=src[len];
while(len-!=0)
d++=s-;
printf("/s”,dest);
return0;
)
答:
方法L
intmain(){
char*sre="hello,world”;
intlen=strlen(src);
char*dest=(char*)malloc(len+1);〃要為\0分配一個(gè)空間
char*d=dest;
char*s=&src[lenT];〃指向最后一個(gè)字符
while(len-!=0)
*d++=*s-;
*d=0;〃尾部要加\0
printf("%s\n",dest);
free(dest);〃使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露
return0;
)
18.用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能?要求給出算法和思路!
設(shè)2個(gè)棧為A,B,一開(kāi)始均為空.
入隊(duì):
將新元素push入棧A;
出隊(duì):
⑴判斷棧B是否為空;
⑵如果不為空,則將棧A中所有元素依次pop出并push到棧B;
(3)將棧B的棧頂元素pop出;這樣實(shí)現(xiàn)的隊(duì)列入隊(duì)和出隊(duì)的平攤復(fù)雜度都還是
0(1),比上面的幾種方法要好
19.下面的程序中x是多少?
enumstring{xl,x2,x3=10,x4,x5,}x;
x=0X801005,0x8010f4;
20多態(tài)的作用?
主要是兩個(gè):L隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼
重用;2.接口重用:為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例
的某一屬性時(shí)的正確調(diào)用。
21.Newdelete與mallocfree的聯(lián)系與區(qū)別?
都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)
數(shù)并且不能初始化對(duì)象,new會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。delete會(huì)調(diào)用對(duì)象的
destructor,而free不會(huì)調(diào)用對(duì)象的destructor.
22.#defineDOUBLE(x)x+x,i=5*D0UBLE(5);i是多少?
答案:i為30。
23.局部變量能否和全局變量重名
答:能,局部會(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)。2、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量答:
extern
可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)
引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫(xiě)錯(cuò)了,那么在編譯期間
會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間
不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)
24全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中為什么
答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中
對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)
25.設(shè)有以下說(shuō)明和定義:
typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;)too;
DATEmax;
則語(yǔ)句printf(H%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是:52
答:DATE是一個(gè)union,變量公用空間.里面最大的變量類(lèi)型是int[5],占用20個(gè)字節(jié).所以它
的大小是20data是一個(gè)struct,每個(gè)變量分開(kāi)占用空間.依次為int4+DATE20+doubles=32.
所以結(jié)果是20+32=52.當(dāng)然…在某些16位編輯器下,ini可能是2字節(jié),那么結(jié)果
是int2+DATE10+double8=2
26.unsignedshorthash(unsignedshortkey){return(key?)%256}
請(qǐng)問(wèn)hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.32
27請(qǐng)問(wèn)下面程序有什么錯(cuò)誤?
inta[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[j][k]=O;把循環(huán)語(yǔ)句內(nèi)外換一下
28下面程序的打印結(jié)果是什么?請(qǐng)分析
#defineMax_CB500
voidLmiQueryCSmd(StructMSgCB*pmsg){
unsignedcharucCmdNum;
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum+4-){......;}死循環(huán),unsignedint值
范圍是0~255
29.各種類(lèi)型與0值的比較
請(qǐng)寫(xiě)出BOOLflag與“零值”比較的if語(yǔ)句。
標(biāo)準(zhǔn)答案:if(flag)或者if(!flag)
如下寫(xiě)法均屬不良風(fēng)格,不得分。if(flag==TRUE)
if(flag==1)if(flag==FALSE)if(flag==0)
請(qǐng)寫(xiě)出floatx與“零值”比較的if語(yǔ)句。(4分)標(biāo)準(zhǔn)答案示例:
constfloatEPSINON=0.00001;
if((x>=-EPSINON)&&(x<=EPSINON)
不可將浮點(diǎn)變量用或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>="或“<二”此類(lèi)形式
如下是錯(cuò)誤的寫(xiě)法,不得分。if(x==0.0)if(x!=0.0)
請(qǐng)寫(xiě)出char*p與“零值”比較的if語(yǔ)句。(3分)標(biāo)準(zhǔn)答案:if(p==NULL)
if(p!=NULL)
如下寫(xiě)法均屬不良風(fēng)格,不得分。if(p==0)if(p!=0)if(p)if(!)
30編寫(xiě)類(lèi)String的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)
已知類(lèi)Siring的原型為:
classString{
public:
String(constchar*str=NULL);//普通構(gòu)造函數(shù)
String(constString&other);//拷貝構(gòu)造函數(shù)
~String(void);〃析構(gòu)函數(shù)
String&operate=(constString&other);//賦值函數(shù)
private:
char*m_data;〃用于保存字符串);
請(qǐng)編寫(xiě)String的上述4個(gè)函數(shù)。標(biāo)準(zhǔn)答案:、
String::-String(void)〃3分{
delete[]m_data;
〃由于m_data是內(nèi)部數(shù)據(jù)類(lèi)型,也可以寫(xiě)成deletem_data;
)
//String的普通構(gòu)造函數(shù)String::String(constchar*str)〃6分{
if(str==NULL){
m_data=newchar[l];//若能加NULL判斷則更好
*m_data=<\0,;}else
(
intlength=strlen(str);
String::-String(void)〃3分{
delete[]m_data;
〃由于m_data是內(nèi)部數(shù)據(jù)類(lèi)型,也可以寫(xiě)成deletem_data;
)
“String的普通構(gòu)造函數(shù)
String::String(constchar*str)〃6分{
if(str==NULL){
m_data=newchar[l];〃若能力I」NULL判斷則更好
*m_data=<\0,;}
else
intlength=strlen(str);
strcpy(m_data,other.m_data);}
〃賦值函數(shù)
String&String::operate=(constString&other)〃13分(
〃(1)檢查自賦值〃4分if(this==&other)
return*this;〃文章來(lái)源草根IT
〃⑵釋放原有的內(nèi)存資源〃3分
delete[]m_data;
//(3)分配新的內(nèi)存資源,并復(fù)制內(nèi)容〃3分
intlength=strlen(other.m_data);
m_data=newchar[length+l];//若能加NULL判斷則更好
strcpy(m_data,other.m_data)
//(4)返回本對(duì)象的引用〃3分
return*this;}
31引用”與指針的區(qū)別是什么?
指針通過(guò)某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序
的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,
就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別
32結(jié)構(gòu)與聯(lián)合有和區(qū)別?
1.結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類(lèi)型成員組成,但在任何同一時(shí)刻,聯(lián)合中只存放了
一個(gè)被選中的成員(所有成員共用一塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存
放地址不同)。
2.對(duì)于聯(lián)合的不同成員賦值,將會(huì)對(duì)其它成員重寫(xiě),原來(lái)成員的值就不存在了,而對(duì)于結(jié)
構(gòu)的不同成員賦值是互不影響的
33.下面關(guān)于“聯(lián)合”的題目的輸出?
a)#include<stdio.h>union{
inti;
charx[2];}a;
voidmain(){
a.xfO]=10;a.x[l]=1;printf("%dH,a.i);}
答案:266(低位低地址,高位高地址,內(nèi)存占用情況是OxOlOA)
b)main(){
union{/*定義一個(gè)聯(lián)合*/
inti;
struct{/*在聯(lián)合中定義一個(gè)結(jié)構(gòu)*/
charfirst;charsecond;}half;}number;
number.i=0x4241;/*聯(lián)合成員賦值*/
prinlf("%c%c\n",number.half.first,mumber.half.second);
number.half.first='a,;/*聯(lián)合中結(jié)構(gòu)成員賦值*/
number.half.second=,b,;
getch();}
答案:AB(0x41對(duì)應(yīng),A',是低位;0x42對(duì)應(yīng)B,是高位)6261(number.i和number.half
共用一塊地址空間)
34關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?
涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個(gè)類(lèi)的一般性聯(lián)系,比如“學(xué)生”和“老師”
就是一種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是一種相對(duì)松散的關(guān)系,聚合類(lèi)不需要對(duì)被聚合
類(lèi)負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:
從實(shí)現(xiàn)的角度講,聚合可以表示為:
classA{...}classB{A*a;..…}而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類(lèi)
與被組合類(lèi)有相同的生命周期,組合類(lèi)要對(duì)被組合類(lèi)負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)
系:實(shí)現(xiàn)的形式是:
classA{...}classB{Aa;...}
35面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之?
1.封裝:將客觀事物抽象成類(lèi),每個(gè)類(lèi)對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,
public)2.繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類(lèi)的屬性和方法而無(wú)需
額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性
和方法,實(shí)現(xiàn)滯后到子類(lèi)實(shí)現(xiàn))。前兩種(類(lèi)繼承)和后一種(對(duì)象組合=>接口繼承以及純虛
函數(shù))構(gòu)成了功能復(fù)用的兩種方式。
3.多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就
可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō),就是一句話:允許將子
類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針
36.重載(overload)和重寫(xiě)(overried,有的書(shū)也叫做“覆蓋”)的區(qū)別?
重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)
類(lèi)型不同,或許兩者都不同)。重寫(xiě):是指子類(lèi)重新定義復(fù)類(lèi)虛函數(shù)的方法。從實(shí)現(xiàn)原理
上來(lái)說(shuō):重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱(chēng)做修飾,然后這些同名函數(shù)
就成了不同的函數(shù)(至少對(duì)于編譯器來(lái)說(shuō)是這樣的)。如,有兩個(gè)同名函數(shù):functionfunc(p:
integer):integer;和functionfunc(p:string):integer;?那么編譯器做過(guò)修飾后的函數(shù)名稱(chēng)
可能是這樣的:int_func、stjfunc.對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)
的。也就是說(shuō),它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無(wú)關(guān)!重寫(xiě):
和多態(tài)真正相關(guān)。當(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ú)法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)
37多態(tài)的作用是什么?
主要是兩個(gè):1.隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;2.接
口重用:為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用
38若沒(méi)有定義拷貝構(gòu)造函數(shù),則編譯器自動(dòng)生成一個(gè)缺省的拷貝構(gòu)造函數(shù),它可能會(huì)產(chǎn)生什
么問(wèn)題?
淺拷貝問(wèn)題,主要原因?yàn)轭?lèi)中如果有指針成員變量時(shí),當(dāng)調(diào)用拷貝構(gòu)造函數(shù)時(shí)只拷貝地址從
而使兩個(gè)對(duì)象的指針變量指向了一個(gè)地址空間。
39簡(jiǎn)述成員函數(shù)、全局函數(shù)和友元函數(shù)的差別。
成員函數(shù)只能由該類(lèi)所實(shí)例化的對(duì)象來(lái)進(jìn)行調(diào)用。[靜態(tài)成員除外]
全局函數(shù)可以在任意位置進(jìn)行調(diào)用。
友元函數(shù)可以讓本類(lèi)和友元類(lèi)對(duì)象調(diào)用。
40.簡(jiǎn)述結(jié)構(gòu)化的程序設(shè)計(jì)、面向?qū)ο蟮某绦蛟O(shè)計(jì)的基本思想。
結(jié)構(gòu)化程序設(shè)計(jì)為從程序代碼的開(kāi)始處按照順序方式執(zhí)行至代碼的結(jié)束位置。是一種順序的方
式,函數(shù)與變量沒(méi)有明顯的聯(lián)系,面向?qū)ο笾饕烟幚硎虑榈氖挛锖头椒ńY(jié)合為一體成為一
個(gè)類(lèi),一個(gè)類(lèi)具備處理一件事情的數(shù)據(jù)變量和處理方法,把數(shù)據(jù)和方法有機(jī)的結(jié)合為了一體,
使每一件事情都具備一定的獨(dú)立性,形成一個(gè)模塊。增加了內(nèi)聚性,降低了耦合性。同時(shí)也增
加了代碼的可讀性以及代碼的重用性。
41結(jié)構(gòu)struct和類(lèi)class有什么異同?
在c語(yǔ)言中struct只能對(duì)數(shù)據(jù)進(jìn)行聚合,而C++的class把數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法也同時(shí)聚
合為?體,增加了內(nèi)聚性。止匕外class擁有可再生性和可抽象性,實(shí)現(xiàn)的代碼的復(fù)用。集中體
現(xiàn)在派生的功能和多態(tài)的功能。同時(shí)class也比struct具備更好的封裝性,體現(xiàn)在三種訪問(wèn)權(quán)
限上。
在C++中的struct和class的結(jié)構(gòu)基本一致,只是struct的默認(rèn)權(quán)限為Public而class為private0
42C++是不是類(lèi)型安全的?
答案:不是。兩個(gè)不同類(lèi)型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)。C#是類(lèi)型安全
的。
43簡(jiǎn)述數(shù)組與指針的區(qū)別?
數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任
意類(lèi)型的內(nèi)存塊。(1)修改內(nèi)容上的差別
chara[]="hello";a[0]='X';
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)退化為同類(lèi)型的指
針。
chara[]="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é))
44如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?
答案:#ifdef_cpluspluscout?"c++";#elsecout?"c";#endif
45.main主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說(shuō)明?
答案:可以,可以用_onexit注冊(cè)一個(gè)函數(shù),它會(huì)在main之后執(zhí)行intfnl(void),fn2
(void),fn3(void),fn4(void);voidmain(void){
Stringstr("zhanglin");_onexit(fnl);_onexit(fn2);_onexit(fn3);_onexit(fn4);
printf("ThisisexecutedfirstAn");}
intfnl(){printf(Hnext.\n");return0;}
intfn2(){printf("executed");return0;}
intfn3(){printf("is");return0;}
intfn4(){printf('This*');return0;}
46文件中有一組整數(shù),要求排序后輸出到另一個(gè)文件中
#include<iostream>#include<fstream>usingnamespacestd;
voidOrder(vector<int>&data)//bubblesort{
intcount=data.size()
inttag=false〃設(shè)置是否需要繼續(xù)冒泡的標(biāo)志位
for(inti=0i<counti++)
{
for(intj=0j<count-i-1j++){
if(data[j]>data[j+l]){
tag=true
inttemp=data[j]
data[j]=data[j+l]datafj+1]=temp}
)
if(!tag)break})
voidmain(void){
vector<int>data;
ifstreamin("c:\\data.txtn);if(Jin){
cout?"fileerror!";
exit(l);}
inttemp;
while(!in.eof()){
in?temp;
data.push_back(temp);}
in.close。;〃關(guān)閉輸入文件流Order(data);
ofstreamout("c:\\result.txt,');if(!out)
(
cout?*'fileerror!";
exit(l);)
for(i=0i<data.size()i++)
out?data?nn;
out.close。;〃關(guān)閉輸出文件流}
47鏈表題:一個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)
structNode{
intdataNode*next};
typedefstructNodeNode
(1)已知鏈表的頭結(jié)點(diǎn)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序(Intel)
Node*ReverseList(Node*head)〃鏈表逆序{
if(head==NULLIIhead->next==NULL)
returnhead;Node*pl=head;Node*p2=p1->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)已知兩個(gè)鏈表headl和head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。(保留
所有結(jié)點(diǎn),即便大小相同)
Node*Merge(Node*headl,Node*head2){
if(head1==NULL)returnhead2;
if(head2==NULL)returnhead1;
Node*head=NULL;
Node*pl=NULL;Node*p2=NULL;
if(headl->data<head2->data){
head=headlpl=headl->next;p2=head2}else
{
head=head2;p2=head2->next;pl=headl;
)
Node*pcurrent=head;
while(pl!=NULL&&p2!=NULL){
if(pl->data<=p2->data){
pcurrent->next=pl;
pcurrent=pl;
pl=pl->next;}
else{
pcurrent->next=p2;pcurrent=p2;p2=p2->next}
)
if(pl!=NULL)pcurrent->next=pl;
if(p2!=NULL)
pcurrent->next=p2;returnhead;}
(3)已知兩個(gè)鏈表headl和head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序,這次要求
用遞歸方法進(jìn)行。(Autodesk)答案:
Node*MergeRecursive(Node*headl,Node*head2){
if(headl==NULL)returnhead2;
if(head2==NULL)returnhead1;
Node*head=NULL;
if(head1->data<head2->data){
head=head1;
head->next=MergeRecursive(head1->next,head2);}else{head=head2;
head->next=MergeRecursive(head1,head2->next);}
returnhead;}
48寫(xiě)一個(gè)函數(shù)找出一個(gè)整數(shù)數(shù)組中,第二大的數(shù)(microsoft)
答案:
constintMINNUMBER=-32767
intfind_sec_max(intdataf],intcount){
intmaxnumber=data[0];intsec_max=MINNUMBER;
for(inti=1i<counti++){
if(data>maxnumber){
sec_max=maxnumber;
maxnumber=data;}else{
if(data>sec_max)
sec_max=data;}}
returnsec_max;}
49如何判斷一個(gè)單鏈表是有環(huán)的?(注意不能用標(biāo)志位,最多只能用兩個(gè)額外指
針)
structnode{charval;node*next;}
boolcheck(constnode*head){)//returnfalse:無(wú)環(huán);true:有環(huán)
一種O(n)的辦法就是(搞兩個(gè)指針,一個(gè)每次遞增一步,一個(gè)每次遞增兩步,如果有環(huán)
的話兩者必然重合,反之亦然):
boolcheck(constnode*head){
if(head==NULL)retumfalse;node*low=head,*fast=head->next;while(fast!=NULL&
&fast->next!=NULL){
low=low->next;
fast=fast->next->next;
if(low==fast)returntrue;}
returnfalse;}
50用變量a給出下面的定義
a)一個(gè)整型數(shù)(Aninteger)b)一個(gè)指向整型數(shù)的指針(Apointertoaninteger)
c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)
(Apointertoapointertoaninteger)d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(Anarrayof10integers)e)一
個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(Anarrayof10pointerstointegers)f)一
個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)
g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)
a)inta;//Aninteger
b)int*a;〃Apointertoaninteger
c)int**a;〃Apointertoapointertoanintegerd)inta[10];//Anarrayof10integers
e)int*a[10];//Anarrayof10pointerstointegers
f)int(*a)[10];//Apointertoanarrayof10integers
g)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger
h)int(*a[10])(int);
51關(guān)鍵字const是什么含意?
我只要一聽(tīng)到被面試者說(shuō):“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。下
面的聲明都是什么意思?constinta;
intconsta;
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í)指針也是不可修改
的)。
52關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。
一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假
設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)
變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:1).并行設(shè)
備的硬件寄存器(如:狀態(tài)寄存器)2).一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量
(Non-automaticvariables)
3).多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量(回答下面問(wèn)題)
1).一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。
2).一個(gè)指針可以是volatile嗎?解釋為什么。
3).下面的函數(shù)有什么錯(cuò)誤:intsquare(volatileint*ptr){
return*ptr**ptr;}
下面是答案:
1).是的。-個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K?/p>
const因?yàn)槌绦虿粦?yīng)該試圖去修改它。
2).是的。盡管這并不很常見(jiàn)。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buiTer的指
針時(shí)。3).這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr指向值的平方,但是,
由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類(lèi)似卜一面的代碼:intsquare(volatileint*ptr){
inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地該變,因此a和b可能
是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
longsquare(volatileint*ptr){
inta;a=*ptr;
returna*a;
53用C++寫(xiě)個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位還是32位的?不能用sizeofO
函數(shù)
A1:
16位的系統(tǒng)下,
inti=65536;
cout?i;//輸出0;
inti=65535;
cout?i;//輸出T;
32位的系統(tǒng)下,
inti=65536;
cout?i;//輸出65536;
inti=65535;
cout?i;//輸出65535;
A2:
inta=、0;
if(a>65536){cout<<z/32bit,,<<endl;}
else{cout?z,16bitz,?endl;}
54C和C++有什么不同?
從機(jī)制上:C是面向過(guò)程的(但C也可以編寫(xiě)面向?qū)ο蟮某绦?;C++是面向?qū)ο蟮?
提供了類(lèi)。但是,C++編寫(xiě)面向?qū)ο蟮某绦虮菴容易從適用的方向:C適合要求代
碼體積小的,效率高的場(chǎng)合,如嵌入式;C++適合更上層的,復(fù)雜的;llinux核
心大部分是c寫(xiě)的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。從名稱(chēng)上也可以看出,
C++比c多了+,說(shuō)明C++是c的超集;那為什么不叫c+而叫C++呢,是因?yàn)镃++比
c來(lái)說(shuō)擴(kuò)充的東西太多了,所以就在c后面放上兩個(gè)+;于是就成了c++C語(yǔ)言是結(jié)
構(gòu)化編程語(yǔ)言,C++是面向?qū)ο缶幊陶Z(yǔ)言。C++側(cè)重于對(duì)象而不是過(guò)程,側(cè)重于類(lèi)
的設(shè)計(jì)而不是邏輯的設(shè)計(jì)
55在不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值
#include<stdio.h>voidmain(){
inti=60;
intj=50;
i=i+j;
j=i-j;
i=i-j;
printf("i=%d/n",i);
printf("j=%d/n",j);}
方法二:
56下面的代碼有什么問(wèn)題?
classA{
public:
A(){p=this;)
~A(){if(p!=NULL){deletep;p=NULL;}}
A*p;
);
答:會(huì)引起無(wú)限遞歸
57sizeof用法總結(jié)
在VC中,sizeof有著許多的用法,而且很容易引起一些錯(cuò)誤。下面根據(jù)sizeof后面的參數(shù)對(duì)
sizeof的用法做個(gè)總結(jié)。
A.參數(shù)為數(shù)據(jù)類(lèi)型或者為一般變量。例如sizeof(int),sizeof(k)ng)等等。這種情況要注意的
是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的。例如int類(lèi)型在16位系統(tǒng)中占2
個(gè)字節(jié),在32位系統(tǒng)中占4個(gè)字節(jié)。
B.參數(shù)為數(shù)組或指針。下面舉例說(shuō)明.
intal5OJ;〃sizeof(a)=4*50=200;求數(shù)組所占的空間大小
int*a=newint[5OJ;//sizeof(a)=4;a為指針sizeof(a)是求指針的大小,在32位系統(tǒng)中,當(dāng)然
是占4個(gè)字節(jié)。
C.參數(shù)為結(jié)構(gòu)或類(lèi)。Sizeof應(yīng)用在類(lèi)和結(jié)構(gòu)的處理情況是相同的。但有兩點(diǎn)需要注意,第
一、結(jié)構(gòu)或者類(lèi)中的靜態(tài)成員不對(duì)結(jié)構(gòu)或者類(lèi)的大小產(chǎn)生影響,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)
構(gòu)或者類(lèi)的實(shí)例地址無(wú)關(guān)。
第二、沒(méi)有成員變量的結(jié)構(gòu)或類(lèi)的大小為1,因?yàn)楸仨毐WC結(jié)構(gòu)或類(lèi)的每一個(gè)實(shí)例在內(nèi)存中都
有唯一的地址。下面舉例說(shuō)明,
ClassTest{inta;staticdoublec};//sizeof(Test)=4.
Test*s;//sizeof(s)=4,s為一個(gè)指針。
Classtestl{};//sizeof(testl)=l;
D.參數(shù)為其他。下面舉例說(shuō)明。
intfunc(chars[5]){
cout<vsizeof(s);〃這里將輸出4,本來(lái)s為一個(gè)數(shù)組,但山于做為函數(shù)的參數(shù)在傳遞的時(shí)
候系統(tǒng)處理為一個(gè)指針,所以sizeof(s)實(shí)際上為求指針的大小。
return1;
)
sizeof(func("1234,,))=4//Efunc的返回類(lèi)型為int,所以相當(dāng)于求sizeof(int).
58.i最后等于多少?
inti=1;
intj=i++;
if((i>j++)&&(i++==j))i+=j;
答:i=5
59數(shù)據(jù)庫(kù):抽出部門(mén),平均工資,要求按部門(mén)的字符串順序排序,不能含有〃human
resource”部門(mén),employee結(jié)構(gòu)如下:employee_id,employee_name,
depart_id,depart_name,wage
答:
selectdepart_name,avg(wage)
fromemployee
wheredepart_name<>'humanresource'
groupbydepart_name
orderbydepart_name
60試編寫(xiě)函數(shù)判斷計(jì)算機(jī)的字節(jié)存儲(chǔ)順序是開(kāi)序(littleendian)還是降序
(bigendian)
答:
boolIsBigendian(){
unsignedshortusData=Ox1122;
unsignedchar*pucData=(unsignedchar*)&usData;
return(*pucData==0x22);
)
61.線程同步的總結(jié)
對(duì)幾種同步對(duì)象的總結(jié)
1.CriticalSection
A.速度快
B.不能用于不同進(jìn)程
C.不能進(jìn)行資源統(tǒng)計(jì)(每次只可以有一個(gè)線程對(duì)共享資源進(jìn)行存取)
2.Mutex
A.速度慢
B.可用于不同進(jìn)程
C.不能進(jìn)行資源統(tǒng)計(jì)
3.Semaphore
A.速度慢
B.可用于不同進(jìn)程
C.可進(jìn)行資源統(tǒng)計(jì)(可以讓一個(gè)或超過(guò)一個(gè)線程對(duì)共享資源進(jìn)行存取)
4.Event
A.速度慢
B.可用于不同進(jìn)程
C.可進(jìn)行資源統(tǒng)計(jì)
62邏輯思維題:101個(gè)硬幣100真、1假,真假區(qū)別在于重量。請(qǐng)用無(wú)祛碼天平稱(chēng)
兩次給出真幣重還是假幣重的結(jié)論。
答:1。個(gè)先取出2堆,33,33
第次稱(chēng),如果不相等,說(shuō)明有一堆重或輕那么把重的那堆拿下來(lái),再放另外35個(gè)中的33
如果相等,說(shuō)明假的重,如果不相等,新放上去的還是重的話,說(shuō)明假的輕(不可能新放上去的輕)
第一次稱(chēng),如果相等的話,這66個(gè)肯定都是真的,從這66個(gè)中取出35個(gè)來(lái),與剩下的沒(méi)稱(chēng)過(guò)的
35個(gè)比下面就不用說(shuō)了
方法二:
第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個(gè)和真的比一下。如果不一樣,就
拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在B(50)中,不一樣就在A(50)中,
結(jié)合第一次的結(jié)果就知道了
63intid[sizeof(unsignedlong));這個(gè)對(duì)嗎?為什么??
答:對(duì),這個(gè)sizeof是編譯時(shí)運(yùn)算符,編譯時(shí)就確定了可以看成和機(jī)器有關(guān)的常量。
64在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern"C”?
首先,作為extern是C/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字,該關(guān)鍵
字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
通常,在模塊的頭文件中對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲
明。例如,如果模塊B欲引用該模塊A中定義的全局變量和函數(shù)時(shí)只需包含模塊A的頭文件
即可。這樣,模塊B中調(diào)用模塊A中的函數(shù)時(shí),在編譯階段,模塊B雖然找不到該函數(shù),但
是并不會(huì)報(bào)錯(cuò);它會(huì)在連接階段中從模塊A編譯生成的目標(biāo)代碼中找到此函數(shù)
extern"C"是連接申明(linkagedeclaration),被extern"C”修飾的變量和函數(shù)是按照C語(yǔ)言方式編
譯和連接的,來(lái)看看C++中對(duì)類(lèi)似。
C的函數(shù)是怎樣編譯的:
作為一種面向?qū)ο蟮恼Z(yǔ)言,C++支持函數(shù)重載,而過(guò)程式語(yǔ)言C則不支持。函數(shù)被C++編譯
后在符號(hào)庫(kù)中的名字與c語(yǔ)言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:
voidfoo(intx,inty);
該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)f。。,而C++編譯器則會(huì)產(chǎn)生像一foo_int_int之
類(lèi)的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱(chēng)為
“mangledname")。
_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類(lèi)型信息,C++就是靠這種機(jī)制來(lái)實(shí)
現(xiàn)函數(shù)重載的。例如,在C++中,函數(shù)voidfoo(intx,inty)與voidfoo(intx,floaty)編譯生成
的符號(hào)是不相同的,后者為_(kāi)foo_int_float。同樣地,C++中的變量除支持局部變量外,還支
持類(lèi)成員變量和全局變量。用戶(hù)所編寫(xiě)程序的類(lèi)成員變量可能與全局變量同名,我們以來(lái)
區(qū)分。而本質(zhì)上,編譯器在進(jìn)行編譯時(shí),與函數(shù)的處理相似,也為類(lèi)中的變量取了一個(gè)獨(dú)一
無(wú)二的名字,這個(gè)名字與用戶(hù)程序中同名的全局變量名字不同
65#defineDOUBLE(x)x+x,i=5*D0UBLE(5);i是多少?
答案:i為30。(注意直接展開(kāi)就是了)5*5+5
66在8086匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)
答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄
存器內(nèi)地址,就得到了真正要訪問(wèn)的地址。
67如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?答案:
cout?_FILE_;
cout<<_LINE—;
_FILE二和_ZlNE_是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的,而是
由編譯器定義的
68觀察下面的程序,找出錯(cuò)誤,主要是字符串的操作
試題1:voidtestl(){
charstring[10];
char*strl="0123456789”;
strcpy(string,strl);
)
試題2:Voidtest2(){
charstring[10],strl[10];
inti;
for(i=0;i<10;i++){strl=!a';}
strcpy(string,strl);
)
試題3:voidtest3(char*strl){
charstring[10];
if(strlen(strl)<=10){strcpy(string,strl);}
)
解答:
試題1字符串strl需要11個(gè)字節(jié)才能存放下(包括末尾的、0)而string只有10個(gè)字節(jié)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川幼兒師范高等專(zhuān)科學(xué)?!洞蟮販y(cè)量學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 晉中師范高等專(zhuān)科學(xué)?!毒W(wǎng)絡(luò)及其計(jì)算》2023-2024學(xué)年第二學(xué)期期末試卷
- 福建對(duì)外經(jīng)濟(jì)貿(mào)易職業(yè)技術(shù)學(xué)院《大學(xué)生勞動(dòng)教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津藝術(shù)職業(yè)學(xué)院《文獻(xiàn)目錄與信息檢索》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025海南省安全員A證考試題庫(kù)及答案
- 貴州中醫(yī)藥大學(xué)時(shí)珍學(xué)院《安全經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年遼寧省七校協(xié)作體高一上學(xué)期12月月考?xì)v史試卷
- 2025江西省建筑安全員-A證考試題庫(kù)及答案
- 漯河醫(yī)學(xué)高等專(zhuān)科學(xué)?!秺W林匹克文化》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧輕工職業(yè)學(xué)院《阿拉伯文學(xué)選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025-2030年園藝修剪機(jī)器人行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢(xún)報(bào)告
- 2025年湖北省技能高考(建筑技術(shù)類(lèi))《建筑工程測(cè)量》模擬練習(xí)試題庫(kù)(含答案)
- 2024-2027年中國(guó)網(wǎng)絡(luò)安全評(píng)估行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略研究報(bào)告
- 失智老年人照護(hù)X證書(shū)制度試點(diǎn)工作養(yǎng)老護(hù)理職業(yè)和失智老人照護(hù)員工種的發(fā)展講解
- 2025年湖南食品藥品職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 企業(yè)數(shù)字化轉(zhuǎn)型戰(zhàn)略-深度研究
- 新種子法律法規(guī)培訓(xùn)講解
- 2025年?yáng)|營(yíng)科技職業(yè)學(xué)院高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 《幼小銜接家長(zhǎng)會(huì)》課件
- Unit 4 A glimpse of the future 說(shuō)課稿-2023-2024學(xué)年高二下學(xué)期英語(yǔ)外研版(2019)選擇性必修第三冊(cè)001
- 鄉(xiāng)村建設(shè)規(guī)劃許可培訓(xùn)
評(píng)論
0/150
提交評(píng)論