一、問答題:50分
1、寫出new和malloc、delete和free的區(qū)別
從面向?qū)ο髞碚f,new/delete和malloc/free的區(qū)別是:malloc/free只是單純的進(jìn)行內(nèi)存空間的分配和釋放,而使用new/delete時(shí),不僅分配了內(nèi)存空間,若new/delete的是一個類,還會調(diào)用類(經(jīng)測試,基本類型好像不會進(jìn)行默認(rèn)初始化)的構(gòu)造函數(shù)或析構(gòu)函數(shù)。
簡單來說,兩者的區(qū)別主要有:
1. malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運(yùn)算符,與”+“、”-“、”*“、”/“有一樣的地位。
2. new/delete是可以重載的,而重載之后,就成為了函數(shù)。
3. malloc在申請內(nèi)存的時(shí)候,必須要提供申請的長度,而且返回的指針是void*型,必須要強(qiáng)轉(zhuǎn)成需要的類型。
4. 當(dāng)new/delete在類中被重載的時(shí)候,可以自定義申請過程,比如記錄所申請內(nèi)存的總長度,以及跟蹤每個對象的指針。
5. new/delete,其實(shí)內(nèi)部也調(diào)用了malloc/free。
兩者的共同點(diǎn)有:
1. 都必須配對使用,防止內(nèi)存泄露。
2. 都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存,都是在堆中分配內(nèi)存。
3. free和delete可以釋放NULL指針。
2、寫兩個繼承類,解釋虛表指針和虛表的作用
每一個類都有虛表。
虛表可以繼承,如果子類沒有重寫虛函數(shù),那么子類虛表中仍然會有該函數(shù)的地址,只不過這個地址指向的是基類的虛函數(shù)實(shí)現(xiàn)。如果基類有3個虛函數(shù),那么基類的虛表中就有三項(xiàng)(虛函數(shù)地址),派生類也會有虛表,至少有三項(xiàng),如果重寫了相應(yīng)的虛函數(shù),那么虛表中的地址就會改變,指向自身的虛函數(shù)實(shí)現(xiàn)。如果派生類有自己的虛函數(shù),那么虛表中就會添加該項(xiàng)。
派生類的虛表中虛函數(shù)地址的排列順序和基類的虛表中虛函數(shù)地址排列順序相同。
3、寫出static的用法和作用
static 是C++中很常用的修飾符,它被用來控制變量的存儲方式和可見性。函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時(shí),編譯器為它在
棧上分配空間,大家知道,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會釋放掉,這樣就產(chǎn)生了一個問題: 如果想將函數(shù)中此變量的值保存至
下一次調(diào)用時(shí),如何實(shí)現(xiàn)? 最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量的
訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)。 需要一個數(shù)據(jù)對象為整個類而非某個對象服務(wù),同時(shí)又力求不破壞類的封裝
性,即要求此成員隱藏在類的內(nèi)部,對外不可見。
4、寫出計(jì)算機(jī)的存儲器層次,及原因
以處理器為中心,計(jì)算機(jī)系統(tǒng)的存儲依次為寄存器、高速緩存、主存儲器、磁盤緩存、磁盤和可移動存儲介質(zhì)等7個層次。距離處理器越近的存儲工作速度越高,容量越小。其中,寄存器、高速緩存、主存儲器為操作系統(tǒng)存儲管理的管轄范圍,磁盤和可移動存儲介質(zhì)屬于操作系統(tǒng)設(shè)備管理的管轄范圍。
5、寫出對windows中的句柄的理解
所謂句柄實(shí)際上是一個數(shù)據(jù),是一個Long (整長型)的數(shù)據(jù)。
句柄是WONDOWS用來標(biāo)識被應(yīng)用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識諸如應(yīng)用程序?qū)嵗,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點(diǎn)象C語言中的文件句柄。
二、算法題:30分
1、計(jì)算字符串的相似度-《編程之美》3.3