成語(yǔ)故事典故以及釋讀
一、問(wèn)答題:50分

1、寫(xiě)出new和malloc、delete和free的區別
從面向對象來(lái)說(shuō),new/delete和malloc/free的區別是:malloc/free只是單純的進(jìn)行內存空間的分配和釋放,而使用new/delete時(shí),不僅分配了內存空間,若new/delete的是一個(gè)類(lèi),還會(huì )調用類(lèi)(經(jīng)測試,基本類(lèi)型好像不會(huì )進(jìn)行默認初始化)的構造函數或析構函數。
簡(jiǎn)單來(lái)說(shuō),兩者的區別主要有:
1. malloc與free是C++/C語(yǔ)言的標準庫函數,new/delete是C++的運算符,與”+“、”-“、”*“、”/“有一樣的地位。
2. new/delete是可以重載的,而重載之后,就成為了函數。
3. malloc在申請內存的時(shí)候,必須要提供申請的長(cháng)度,而且返回的指針是void*型,必須要強轉成需要的類(lèi)型。
4. 當new/delete在類(lèi)中被重載的時(shí)候,可以自定義申請過(guò)程,比如記錄所申請內存的總長(cháng)度,以及跟蹤每個(gè)對象的指針。
5. new/delete,其實(shí)內部也調用了malloc/free。
兩者的共同點(diǎn)有:
1. 都必須配對使用,防止內存泄露。
2. 都可用于申請動(dòng)態(tài)內存和釋放內存,都是在堆中分配內存。
3. free和delete可以釋放NULL指針。
2、寫(xiě)兩個(gè)繼承類(lèi),解釋虛表指針和虛表的作用
每一個(gè)類(lèi)都有虛表。
虛表可以繼承,如果子類(lèi)沒(méi)有重寫(xiě)虛函數,那么子類(lèi)虛表中仍然會(huì )有該函數的地址,只不過(guò)這個(gè)地址指向的是基類(lèi)的虛函數實(shí)現。如果基類(lèi)有3個(gè)虛函數,那么基類(lèi)的虛表中就有三項(虛函數地址),派生類(lèi)也會(huì )有虛表,至少有三項,如果重寫(xiě)了相應的虛函數,那么虛表中的地址就會(huì )改變,指向自身的虛函數實(shí)現。如果派生類(lèi)有自己的虛函數,那么虛表中就會(huì )添加該項。
派生類(lèi)的虛表中虛函數地址的排列順序和基類(lèi)的虛表中虛函數地址排列順序相同。
3、寫(xiě)出static的用法和作用
static 是C++中很常用的修飾符,它被用來(lái)控制變量的存儲方式和可見(jiàn)性。函數內部定義的變量,在程序執行到它的定義處時(shí),編譯器為它在
棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時(shí)會(huì )釋放掉,這樣就產(chǎn)生了一個(gè)問(wèn)題: 如果想將函數中此變量的值保存至
下一次調用時(shí),如何實(shí)現? 最容易想到的方法是定義一個(gè)全局的變量,但定義為一個(gè)全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量的
訪(fǎng)問(wèn)范圍(使得在此函數中定義的變量,不僅僅受此函數控制)。 需要一個(gè)數據對象為整個(gè)類(lèi)而非某個(gè)對象服務(wù),同時(shí)又力求不破壞類(lèi)的封裝
性,即要求此成員隱藏在類(lèi)的內部,對外不可見(jiàn)。
4、寫(xiě)出計算機的存儲器層次,及原因
以處理器為中心,計算機系統的存儲依次為寄存器、高速緩存、主存儲器、磁盤(pán)緩存、磁盤(pán)和可移動(dòng)存儲介質(zhì)等7個(gè)層次。距離處理器越近的存儲工作速度越高,容量越小。其中,寄存器、高速緩存、主存儲器為操作系統存儲管理的管轄范圍,磁盤(pán)和可移動(dòng)存儲介質(zhì)屬于操作系統設備管理的管轄范圍。
5、寫(xiě)出對windows中的句柄的理解
所謂句柄實(shí)際上是一個(gè)數據,是一個(gè)Long (整長(cháng)型)的數據。
句柄是WONDOWS用來(lái)標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實(shí)例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點(diǎn)象C語(yǔ)言中的文件句柄。
二、算法題:30分
1、計算字符串的相似度-《編程之美》3.3
int calStringDis(string strA, int pABegin,int pAEnd,string strB, int pBBegin,int pBEnd)
{
if (pABegin > pAEnd)
{
if (pBBegin > pBEnd)
return 0;
else
return pBEnd – pBBegin + 1;
}
if (pBBegin > pBEnd)
{
if(pABegin > pAEnd)
return 0;
else
return pAEnd – pABegin + 1;
}
if (strA[pABegin] == strB[pBBegin])
{
return calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
}
else
{
int t1 = calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+2,pBEnd);
int t2 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+1,pBEnd);
int t3 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+2,pBEnd);
return minValue(t1,t2,t3)+1;
}
}
2、判斷鏈表是否存在閉環(huán)
/pic/p>
/pic/p>
int HasLoop(LinkList L)
{
int step1 = 1;
int step2 = 2;
LinkList p = L;
LinkList q = L;
/pic/p>
while (p != NULL && q != NULL && q->next != NULL)
{
p = p->next;
if (q->next != NULL)
q = q->next->next;
printf("p:%d, q:%d \n", p->data, q->data);
if (p == q)
return 1;
}
return 0;
}
三、系統設計題:選做一題 20分
1、連連看游戲中,寫(xiě)出兩種算法的大致原理,來(lái)判斷兩個(gè)圖案是否能夠連線(xiàn)。并詳細解釋?zhuān)瑢?xiě)出其中一個(gè)算法的偽代碼。
2、解釋 延遲過(guò)程調用deferred procedure call (DPC)和異步過(guò)程調用asynchronous procdure call (APC)的工作機制。詳細描述利用APC實(shí)現DLL注入。
【成語(yǔ)故事典故以及釋讀】相關(guān)文章:
指鹿為馬的成語(yǔ)故事典故08-31
關(guān)于智謀典故成語(yǔ)故事05-11
關(guān)于動(dòng)物的成語(yǔ)故事典故06-03
成語(yǔ)故事之大義滅親的典故09-05
歷史的典故09-20
經(jīng)典的歷史典故05-29
經(jīng)典的歷史典故02-06
歷史典故11-17
歷史典故:外國典故32個(gè)02-06
酒的歷史典故10-10
- 相關(guān)推薦