123道c++筆試題匯總(含答案)

寫(xiě)在前面:

猶豫了一下桶略,不知道該不該發(fā)這么多。畢竟題目雖全诲宇,但是其實(shí)很多人看了不到一半际歼,估計(jì)就會(huì)默默的收藏保存,等待下次再看姑蓝。

相比與技術(shù)的內(nèi)容鹅心,時(shí)間和學(xué)習(xí)效率也是很重要的。如何規(guī)劃也是我們需要思考的問(wèn)題纺荧。

1.new旭愧、delete、malloc宙暇、free關(guān)系

new和delete對(duì)應(yīng)输枯、malloc和free對(duì)應(yīng)

new和delete是c++語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),而malloc和free是c++的運(yùn)算符

它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存占贫,區(qū)別在對(duì)非內(nèi)部數(shù)據(jù)類(lèi)型的對(duì)象而言桃熄,malloc和free無(wú)法滿(mǎn)足動(dòng)態(tài)對(duì)象的要求(因?yàn)閷?duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù))

2.delete與 delete []的區(qū)別

delete只會(huì)調(diào)用一次析構(gòu)函數(shù)靶剑,而delete[]會(huì)調(diào)用每一個(gè)成員的析構(gòu)函數(shù)

delete和new對(duì)應(yīng)蜻拨,delete []和new []對(duì)應(yīng)

注意:對(duì)于內(nèi)建簡(jiǎn)單數(shù)據(jù)類(lèi)型,delete和delete[]功能是相同的桩引。對(duì)于自定義的復(fù)雜數(shù)據(jù)類(lèi)型缎讼,delete和delete[]不能互用

3.C C++ JAVA共同點(diǎn),不同之處坑匠?

JAVA和C++都是面向?qū)ο笳Z(yǔ)言血崭。也就是說(shuō),它們都能夠?qū)崿F(xiàn)面向?qū)ο笏枷耄ǚ庋b介褥,繼乘刁愿,多態(tài))楞黄。而由于c++為了照顧大量的C語(yǔ)言使用者而兼容了C谷市,使得自身僅僅成為了帶類(lèi)的C語(yǔ)言元咙,多多少少影響了其面向?qū)ο蟮膹氐仔怨螅AVA則是完全的面向?qū)ο笳Z(yǔ)言奏夫,它句法更清晰薛匪,規(guī)模更小月匣,更易學(xué)钻洒。它是在對(duì)多種程序設(shè)計(jì)語(yǔ)言進(jìn)行了深入細(xì)致研究的基礎(chǔ)上,據(jù)棄了其他語(yǔ)言的不足之處锄开,從根本上解決了c++的固有缺陷素标。

Java和c++的相似之處多于不同之處,但兩種語(yǔ)言問(wèn)幾處主要的不同使得Java更容易學(xué)習(xí)萍悴,并且編程環(huán)境更為簡(jiǎn)單头遭。?

我在這里不能完全列出不同之處,僅列出比較顯著的區(qū)別:

(1.指針?

JAVA語(yǔ)言讓編程者無(wú)法找到指針來(lái)直接訪(fǎng)問(wèn)內(nèi)存無(wú)指針癣诱,并且增添了自動(dòng)的內(nèi)存管理功能计维,從而有效地防止了c/c++語(yǔ)言中指針操作失誤,如野指針?biāo)斐傻南到y(tǒng)崩潰撕予。但也不是說(shuō)JAVA沒(méi)有指針享潜,虛擬機(jī)內(nèi)部還是使用了指針,只是外人不得使用而已嗅蔬。這有利于Java程序的安全剑按。

(2.多重繼承?

c++支持多重繼承,這是c++的一個(gè)特征澜术,它允許多父類(lèi)派生一個(gè)類(lèi)艺蝴。盡管多重繼承功能很強(qiáng),但使用復(fù)雜鸟废,而且會(huì)引起許多麻煩猜敢,編譯程序?qū)崿F(xiàn)它也很不容易。Java不支持多重繼承盒延,但允許一個(gè)類(lèi)繼承多個(gè)接口(extends+implement)缩擂,實(shí)現(xiàn)了c++多重繼承的功能,又避免了c++中的多重繼承實(shí)現(xiàn)方式帶來(lái)的諸多不便添寺。?

(3.?dāng)?shù)據(jù)類(lèi)型及類(lèi)?

Java是完全面向?qū)ο蟮恼Z(yǔ)言胯盯,所有函數(shù)和變量部必須是類(lèi)的一部分。除了基本數(shù)據(jù)類(lèi)型之外计露,其余的都作為類(lèi)對(duì)象博脑,包括數(shù)組憎乙。對(duì)象將數(shù)據(jù)和方法結(jié)合起來(lái),把它們封裝在類(lèi)中叉趣,這樣每個(gè)對(duì)象都可實(shí)現(xiàn)自己的特點(diǎn)和行為泞边。而c++允許將函數(shù)和變量定義為全局的。此外疗杉,Java中取消了c/c++中的結(jié)構(gòu)和聯(lián)合阵谚,消除了不必要的麻煩。

(4.自動(dòng)內(nèi)存管理?

Java程序中所有的對(duì)象都是用new操作符建立在內(nèi)存堆棧上烟具,這個(gè)操作符類(lèi)似于c++的new操作符椭蹄。下面的語(yǔ)句由一個(gè)建立了一個(gè)類(lèi)Read的對(duì)象,然后調(diào)用該對(duì)象的work方法:?

Read r=new Read()净赴;?

r.work();?

語(yǔ)句Read r=new Read()罩润;在堆棧結(jié)構(gòu)上建立了一個(gè)Read的實(shí)例玖翅。Java自動(dòng)進(jìn)行無(wú)用內(nèi)存回收操作,不需要程序員進(jìn)行刪除割以。而c十十中必須由程序貝釋放內(nèi)存資源金度,增加了程序設(shè)計(jì)者的負(fù)扔。Java中當(dāng)一個(gè)對(duì)象不被再用到時(shí)严沥,無(wú)用內(nèi)存回收器將給它加上標(biāo)簽以示刪除猜极。JAVA里無(wú)用內(nèi)存回收程序是以線(xiàn)程方式在后臺(tái)運(yùn)行的,利用空閑時(shí)間工作消玄。

(5.操作符重載?

Java不支持操作符重載跟伏。操作符重載被認(rèn)為是c十十的突出特征,在Java中雖然類(lèi)大體上可以實(shí)現(xiàn)這樣的功能翩瓜,但操作符重載的方便性仍然丟失了不少受扳。Java語(yǔ)言不支持操作符重載是為了保持Java語(yǔ)言盡可能簡(jiǎn)單。

(6.預(yù)處理功能?

Java不支持預(yù)處理功能兔跌。c/c十十在編譯過(guò)程中都有一個(gè)預(yù)編澤階段勘高,即眾所周知的預(yù)處理器。預(yù)處理器為開(kāi)發(fā)人員提供了方便坟桅,但增加丁編譯的復(fù)雜性华望。JAVA虛擬機(jī)沒(méi)有預(yù)處理器,但它提供的引入語(yǔ)句(import)與c十十預(yù)處理器的功能類(lèi)似仅乓。

(7. Java不支持函數(shù)赖舟,而c十十支持?

在c中,代碼組織在函數(shù)中夸楣,函數(shù)可以訪(fǎng)問(wèn)程序的全局變量建蹄。c十十增加了類(lèi)碌更,提供了類(lèi)算法,該算法是與類(lèi)相連的函數(shù)洞慎,c十十類(lèi)方法與Java類(lèi)方法十分相似痛单,然而,由于c十十仍然支持c劲腿,所以不能阻止c十十開(kāi)發(fā)人員使用函數(shù)旭绒,結(jié)果函數(shù)和方法混合使用使得程序比較混亂。?

Java沒(méi)有函數(shù)焦人,作為一個(gè)比c十十更純的面向?qū)ο蟮恼Z(yǔ)言挥吵,Java強(qiáng)迫開(kāi)發(fā)人員把所有例行程序包括在類(lèi)中,事實(shí)上花椭,用方法實(shí)現(xiàn)例行程序可激勵(lì)開(kāi)發(fā)人員更好地組織編碼忽匈。

(8 字符串?

c和c十十不支持字符串變量,在c和c十十程序中使用Null終止符代表字符串的結(jié)束矿辽,在Java中字符串是用類(lèi)對(duì)象(strinR和stringBuffer)來(lái)實(shí)現(xiàn)的丹允,這些類(lèi)對(duì)象是Java語(yǔ)言的核心,用類(lèi)對(duì)象實(shí)現(xiàn)字符串有以下幾個(gè)優(yōu)點(diǎn):?

(1)在整個(gè)系統(tǒng)中建立字符串和訪(fǎng)問(wèn)字符串元素的方法是一致的袋倔;?

(2)Java字符串類(lèi)是作為Java語(yǔ)言的一部分定義的雕蔽,而不是作為外加的延伸部分;?

(3)Java字符串執(zhí)行運(yùn)行時(shí)檢空宾娜,可幫助排除一些運(yùn)行時(shí)發(fā)生的錯(cuò)誤批狐;?

(4)可對(duì)字符串用“十”進(jìn)行連接操作

(9“goto語(yǔ)句?

“可怕”的goto語(yǔ)句是c和c++的“遺物”,它是該語(yǔ)言技術(shù)上的合法部分前塔,引用goto語(yǔ)句引起了程序結(jié)構(gòu)的混亂嚣艇,不易理解,goto語(yǔ)句子要用于無(wú)條件轉(zhuǎn)移子程序和多結(jié)構(gòu)分支技術(shù)华弓。鑒于以廣理由髓废,Java不提供goto語(yǔ)句,它雖然指定goto作為關(guān)鍵字该抒,但不支持它的使用慌洪,使程序簡(jiǎn)潔易讀。

(10.類(lèi)型轉(zhuǎn)換?

在c和c十十中有時(shí)出現(xiàn)數(shù)據(jù)類(lèi)型的隱含轉(zhuǎn)換凑保,這就涉及了自動(dòng)強(qiáng)制類(lèi)型轉(zhuǎn)換問(wèn)題冈爹。例如,在c十十中可將一浮點(diǎn)值賦予整型變量欧引,并去掉其尾數(shù)频伤。Java不支持c十十中的自動(dòng)強(qiáng)制類(lèi)型轉(zhuǎn)換,如果需要芝此,必須由程序顯式進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換憋肖。

(11.異常?

JAVA中的異常機(jī)制用于捕獲例外事件因痛,增強(qiáng)系統(tǒng)容錯(cuò)能力?

try{//可能產(chǎn)生例外的代碼?

}catch(exceptionType name){?

//處理?

}?

其中exceptionType表示異常類(lèi)型。而C++則沒(méi)有如此方便的機(jī)制岸更。

4.繼承的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):類(lèi)繼承是在編譯時(shí)刻靜態(tài)定義的鸵膏,且可直接使用,類(lèi)繼承可以較方便的改變父類(lèi)的實(shí)現(xiàn)

缺點(diǎn):無(wú)法在運(yùn)行時(shí)刻改變從父類(lèi)繼承的實(shí)現(xiàn)怎炊;父類(lèi)通常至少定義了子類(lèi)的部分行為谭企,父類(lèi)的任何改變都可能影響子類(lèi)的行為;如果繼承下來(lái)的實(shí)現(xiàn)不適合解決新的問(wèn)題评肆,則父類(lèi)必須重寫(xiě)或被其他更適合的類(lèi)替換债查,這種依賴(lài)關(guān)系限制了靈活性并最終限制了復(fù)用性

5.5.C++有哪些性質(zhì)(面向?qū)ο筇攸c(diǎn))

封裝、繼承和多態(tài)

6.子類(lèi)析構(gòu)時(shí)要調(diào)用父類(lèi)的析構(gòu)函數(shù)嗎瓜挽?

析構(gòu)函數(shù)的調(diào)用次序:先派生類(lèi)的析構(gòu)后基類(lèi)的析構(gòu)

構(gòu)造函數(shù)的調(diào)用次序:先基類(lèi)的構(gòu)造后派生類(lèi)的構(gòu)造

7.多態(tài)盹廷,虛函數(shù),純虛函數(shù)

虛函數(shù)

虛函數(shù)是指一個(gè)類(lèi)中你希望重載的成員函數(shù)久橙,當(dāng)你用一個(gè)基類(lèi)指針或引用指向一個(gè)繼承類(lèi)對(duì)象的時(shí)候俄占,你調(diào)用一個(gè)虛函數(shù),實(shí)際調(diào)用的是繼承類(lèi)的版本剥汤。虛函數(shù)是在基類(lèi)中被聲明為virtual,并在派生類(lèi)中重新定義的成員函數(shù)排惨】愿遥可實(shí)現(xiàn)成員函數(shù)的動(dòng)態(tài)重載。虛函數(shù)是成員函數(shù)暮芭,而且是非static的成員函數(shù)鹿驼。說(shuō)明虛函數(shù)的方法如:virtual <類(lèi)型說(shuō)明符><函數(shù)名>(<參數(shù)表>) 其中,被關(guān)鍵字virtual說(shuō)明的函數(shù)稱(chēng)為虛函數(shù)辕宏。

如果某類(lèi)中的一個(gè)成員函數(shù)被說(shuō)明為虛函數(shù)畜晰,這就意味著該成員函數(shù)在派生類(lèi)中可能有不同的實(shí)現(xiàn)。(例:一句俗話(huà)就是“聾子的耳朵——擺設(shè)”瑞筐,就象一個(gè)殘疾人士凄鼻,可能他聽(tīng)不見(jiàn),但不代表他兒子聽(tīng)不見(jiàn)聚假,我們一般把基類(lèi)叫做“父類(lèi)”块蚌,派生類(lèi)叫做“子類(lèi)”。但我們不能說(shuō)“龍生龍膘格,鳳生風(fēng)峭范,老鼠生兒會(huì)打洞”啊瘪贱!他老爸的耳朵是擺設(shè)纱控,但在兒子這里就是接受信息的器官了辆毡。)

(1) 與基類(lèi)的虛函數(shù)有相同的參數(shù)個(gè)數(shù);

(2) 其參數(shù)的類(lèi)型與基類(lèi)的虛函數(shù)的對(duì)應(yīng)參數(shù)類(lèi)型相同甜害;

(3) 其返回值或者與基類(lèi)虛函數(shù)的相同舶掖,或者都返回指針或引用,并且派生類(lèi)虛函數(shù)所返回的指針或引用的基類(lèi)型是基類(lèi)中被替換的虛函數(shù)所返回的指針或引用的基類(lèi)型的子類(lèi)型唾那。(就像他老爹不識(shí)字访锻,但是他可以讓他讀大學(xué)的兒子來(lái)帶他看信,讀報(bào)一樣)一般要求基類(lèi)中說(shuō)明了虛函數(shù)后闹获,派生類(lèi)說(shuō)明的虛函數(shù)應(yīng)該與基類(lèi)中虛函數(shù)的參數(shù)個(gè)數(shù)相等期犬,對(duì)應(yīng)參數(shù)的類(lèi)型相同,如果不相同避诽,則將派生類(lèi)虛函數(shù)的參數(shù)的類(lèi)型強(qiáng)制轉(zhuǎn)換為基類(lèi)中虛函數(shù)的參數(shù)類(lèi)型龟虎。

純虛函數(shù)

純虛函數(shù)是一種特殊的虛函數(shù),是在基類(lèi)中聲明的但在基類(lèi)中沒(méi)有定義沙庐,要求任何派生類(lèi)都要定義自己的實(shí)現(xiàn)方法鲤妥。在基類(lèi)中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加“=0”。它的一般格式如下:

class <類(lèi)名>

{

virtual <類(lèi)型><函數(shù)名>(<參數(shù)表>)=0;

};

在許多情況下拱雏,在基類(lèi)中不能對(duì)虛函數(shù)給出有意義有實(shí)現(xiàn)棉安,而把它說(shuō)明為純虛函數(shù),它的實(shí)現(xiàn)留給該基類(lèi)的派生類(lèi)去做铸抑。這就是純虛函數(shù)的作用贡耽。

抽象類(lèi)

包含純虛函數(shù)的類(lèi)稱(chēng)為抽象類(lèi)。由于抽象類(lèi)包含了沒(méi)有定義的純虛函數(shù)鹊汛,所以不能定義抽象類(lèi)的對(duì)象蒲赂。抽象類(lèi)是一種特殊的類(lèi),它是為了抽象和設(shè)計(jì)的目的而建立的刁憋,它處于繼承層次結(jié)構(gòu)的較上層滥嘴。抽象類(lèi)是不能定義對(duì)象的,在實(shí)際中為了強(qiáng)調(diào)一個(gè)類(lèi)是抽象類(lèi)至耻,可將該類(lèi)的構(gòu)造函數(shù)說(shuō)明為保護(hù)的訪(fǎng)問(wèn)控制權(quán)限若皱。抽象類(lèi)的主要作用是將有關(guān)的組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為它們提供一個(gè)公共的根尘颓,相關(guān)的子類(lèi)是從這個(gè)根派生出來(lái)的是尖。(例:就是一個(gè)手機(jī)模具)抽象類(lèi)刻畫(huà)了一組子類(lèi)的操作接口的通用語(yǔ)義,這些語(yǔ)義也傳給子類(lèi)泥耀。一般而言饺汹,抽象類(lèi)只描述這組子類(lèi)共同的操作接口,而完整的實(shí)現(xiàn)留給子類(lèi)痰催。抽象類(lèi)只能作為基類(lèi)來(lái)使用兜辞,其純虛函數(shù)的實(shí)現(xiàn)由派生類(lèi)給出迎瞧。如果派生類(lèi)沒(méi)有重新定義純虛函數(shù),而派生類(lèi)只是繼承基類(lèi)的純虛函數(shù)逸吵,則這個(gè)派生類(lèi)仍然還是一個(gè)抽象類(lèi)凶硅。如果派生類(lèi)中給出了基類(lèi)純虛函數(shù)的實(shí)現(xiàn),則該派生類(lèi)就不再是抽象類(lèi)了扫皱,它是一個(gè)可以建立對(duì)象的具體類(lèi)了足绅。

多態(tài)性

同一操作作用于不同的對(duì)象,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果韩脑,這就是多態(tài)性氢妈。多態(tài)性分為兩種,一種是編譯時(shí)的多態(tài)性段多,一種是運(yùn)行時(shí)的多態(tài)性首量。編譯時(shí)的多態(tài)性:編譯時(shí)的多態(tài)性是通過(guò)重載來(lái)實(shí)現(xiàn)的。對(duì)于非虛的成員來(lái)說(shuō)进苍,系統(tǒng)在編譯時(shí)加缘,根據(jù)傳遞的參數(shù)、返回的類(lèi)型等信息決定實(shí)現(xiàn)何種操作觉啊。運(yùn)行時(shí)的多態(tài)性:運(yùn)行時(shí)的多態(tài)性就是指直到系統(tǒng)運(yùn)行時(shí)拣宏,才根據(jù)實(shí)際情況決定實(shí)現(xiàn)何種操作。C#中運(yùn)行時(shí)的多態(tài)性是通過(guò)覆寫(xiě)虛成員實(shí)現(xiàn)杠人。

8.求下面函數(shù)的返回值(微軟)

int func(x)?

{?

int countx = 0;?

while(x)?

{?

countx ++;?

x = x&(x-1);?

}?

return countx;?

}?

假定x = 9999勋乾。 答案:8

分析:&表示位與運(yùn)算(1 & 1 == 1,1 & 0 == 0 & 1 == 0 & 0 == 0)

如x二進(jìn)制最后一位是1搜吧,則x-1最后一位變?yōu)?市俊,前面不變杨凑,而1 & 0 = 0滤奈,所以最后一位的1變?yōu)榱?

如x最后一位是0,

若x前面全是0撩满,循環(huán)結(jié)束

若x前面有...100..00蜒程,則x-1為...011..11(前面相同),兩個(gè)按位與伺帘,則變?yōu)?..000..00(前面相同)昭躺,則加粗的1變?yōu)榱?:...100..00(前面相同)

而9999=1024x9+512+256+15

9x1024有2個(gè)1,512有1個(gè)1,256有1個(gè)1,15有4個(gè)1,一共8個(gè)1

9.什么是“引用”伪嫁?申明和使用“引用”要注意哪些問(wèn)題领炫?

引用就是某個(gè)目標(biāo)變量的別名(alias),對(duì)引用的操作與對(duì)變量的直接操作效果完全相同

申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化

引用申明完畢后张咳,不能再把該引用名作為其他變量名的別名帝洪,引用本身不是一種數(shù)據(jù)類(lèi)型,因此它本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元新蟆,不能建立數(shù)組的引用

10.將“引用”作為函數(shù)參數(shù)有哪些特點(diǎn)饰及?

<1>傳遞引用給函數(shù)和傳遞指針的效果是一樣的

<2>使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒(méi)有產(chǎn)生實(shí)參的副本砰奕,它是直接對(duì)實(shí)參操作(當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí)蛛芥,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好)

<3>與指針作為函數(shù)的參數(shù),需要分配存儲(chǔ)單元军援,且容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差仅淑;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處盖溺,必須用變量的地址作為實(shí)參漓糙,而引用更容易使用、更清晰

11.在什么時(shí)候需要使用“常引用”烘嘱?昆禽。

如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變蝇庭,就應(yīng)使用常引用醉鳖。

引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const

12.將“引用”作為函數(shù)返回值類(lèi)型的格式哮内、好處和需要遵守的規(guī)則?

格式:類(lèi)型標(biāo)識(shí)符 &函數(shù)名(形參列表及類(lèi)型說(shuō)明){ //函數(shù)體 }

好處:在內(nèi)存中不產(chǎn)生被返回值的副本(所以返回一個(gè)局部變量的引用是不可取的)盗棵;

遵守的規(guī)則:

(1)不能返回局部變量的引用

(2)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

(3)可以返回類(lèi)成員的引用,但最好是const

(4)賦值操作符(賦值操作符的返回值必須是一個(gè)左值)北发、流操作符重載返回值申明為“引用”

(5)在另外的一些操作符中纹因,卻千萬(wàn)不能返回引用:+-*/ 四則運(yùn)算符

13.“引用”與多態(tài)的關(guān)系?

引用是除指針外另一個(gè)可以產(chǎn)生多態(tài)效果的手段琳拨。這意味著瞭恰,一個(gè)基類(lèi)的引用可以指向它的派生類(lèi)實(shí)例

例:Class A; Class B : Class A{...}; B b; A& ref = b;

14.“引用”與指針的區(qū)別是什么?

指針通過(guò)某個(gè)指針變量指向一個(gè)對(duì)象后狱庇,對(duì)它所指向的變量間接操作惊畏。程序中使用指針,程序的可讀性差密任;而引用本身就是目標(biāo)變量的別名颜启,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外浪讳,就是上面提到的對(duì)函數(shù)傳引用和指針的區(qū)別缰盏。

15.什么時(shí)候需要“引用”?

流操作符<<和>>、賦值操作符=的返回值口猜、拷貝構(gòu)造函數(shù)的參數(shù)形葬、賦值操作符=的參數(shù)、其它情況都推薦使用引用暮的。

16.結(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)的不同成員賦值是互不影響的

17.下面關(guān)于“聯(lián)合”的題目的輸出?

a)

#include <stdio.h>

union

{

? ? ? int i;

? ? ? char x[2];

}a;

void main()

{

? ? ? a.x[0] = 10;

? ? ? a.x[1] = 1;

? ? ? printf("%d",a.i);

}

d>

答案:

對(duì)a.x賦值咙咽,即:

? ? ? ? ? ? ? ? ? ? ? x[1]=1? x[0]=10

0000? 0000? 0001? 1010

所以a.i = 11010(2) =? 266(10)

b)

main()

? ? {

? ? ? ? ? union{? ? ? ? ? ? ? ? ? /*定義一個(gè)聯(lián)合*/

? ? ? ? ? ? ? int i;

? ? ? ? ? ? ? struct{? ? ? ? ? ? /*在聯(lián)合中定義一個(gè)結(jié)構(gòu)*/

? ? ? ? ? ? ? ? ? ? char first;

? ? ? ? ? ? ? ? ? ? char second;

? ? ? ? ? ? ? }half;

? ? ? ? ? }number;

? ? ? ? ? number.i=0x4241;? ? ? ? /*聯(lián)合成員賦值*/

? ? ? ? ? printf("%c%cn", number.half.first, mumber.half.second);

? ? ? ? ? number.half.first='a';? /*聯(lián)合中結(jié)構(gòu)成員賦值*/

? ? ? ? ? number.half.second='b';

? ? ? ? ? printf("%xn", number.i);

? ? ? ? ? getch();

? ? }

答案: AB? (0x41對(duì)應(yīng)'A',是低位老玛;Ox42對(duì)應(yīng)'B',是高位)

? ? ? 6261 (number.i和number.half共用一塊地址空間)

附ASCII表:http://www.96yx.com/tool/ASC2.htm

18.關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別钧敞?

關(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)的角度講娇唯,聚合可以表示為:

class A {...} class B { 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)的形式是:

class A{...} class B{ A a; ...}

19.面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之拓哟?

封裝:將客觀(guān)事物抽象成類(lèi)想许,每個(gè)類(lèi)對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected彰檬,public)

繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力)伸刃、可視繼承(子窗口使用父窗口的外觀(guān)和實(shí)現(xiàn)代碼)谎砾、接口繼承(僅適用屬性和方法逢倍,實(shí)現(xiàn)滯后到子類(lèi)實(shí)現(xiàn))。前兩種(類(lèi)繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式

多態(tài):同7景图,允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針,

20.重載(overload)和重寫(xiě)(overried较雕,有的書(shū)也叫做“覆蓋”)的區(qū)別?

從定義上來(lái)說(shuō):

重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同亮蒋,或許參數(shù)類(lèi)型不同扣典,或許兩者都不同)。

重寫(xiě):是指子類(lèi)重新定義父類(lèi)虛函數(shù)的方法慎玖。

從實(shí)現(xiàn)原理上來(lái)說(shuō):

重載:編譯器根據(jù)函數(shù)不同的參數(shù)表贮尖,對(duì)同名函數(shù)的名稱(chēng)做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對(duì)于編譯器來(lái)說(shuō)是這樣的)趁怔。如湿硝,有兩個(gè)同名函數(shù):function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過(guò)修飾后的函數(shù)名稱(chēng)可能是這樣的:int_func润努、str_func关斜。對(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)行期綁定的(晚綁定)

21.多態(tài)的作用唬复?

1.隱藏實(shí)現(xiàn)細(xì)節(jié)矗积,使得代碼能夠模塊化,并且能夠擴(kuò)展代碼模塊敞咧,實(shí)現(xiàn)代碼重用

2.接口重用:為了類(lèi)在繼承和派生的時(shí)候棘捣,保證使用家族中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用

22.Ado與http://Ado.net的相同與不同?

除了“能夠讓?xiě)?yīng)用程序處理存儲(chǔ)于DBMS中的數(shù)據(jù)“這一基本相似點(diǎn)外休建,兩者沒(méi)有太多共同之處乍恐。

Ado使用OLE DB接口并基于微軟的COM 技術(shù),而http://ADO.NET擁有自己的http://ADO.NET接口并且基于微軟的.NET體系架構(gòu)测砂。眾所周知.NET體系不同于COM體系茵烈,http://ADO.NET接口也就完全不同于ADO和OLE DB接口,這也就是說(shuō)http://ADO.NET和ADO是兩種數(shù)據(jù)訪(fǎng)問(wèn)方式砌些。http://ADO.net提供對(duì)XML的支持呜投。

23.同第1題

24.#define DOUBLE(x) x+x 加匈,i = 5*DOUBLE(5); i 是多少仑荐?

答案:i 為30雕拼。

25.有哪幾種情況只能用intialization list而不能用assignment??

答案:當(dāng)類(lèi)中含有const、reference成員變量粘招,基類(lèi)的構(gòu)造函數(shù)都需要初始化表啥寇。

26. C++是不是類(lèi)型安全的?

答案:不是洒扎。兩個(gè)不同類(lèi)型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpret cast)示姿。C#是類(lèi)型安全的。

27. main 函數(shù)執(zhí)行以前逊笆,還會(huì)執(zhí)行什么代碼栈戳?

答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在main 函數(shù)之前執(zhí)行。

28. 描述內(nèi)存分配方式以及它們的區(qū)別?

1) 從靜態(tài)存儲(chǔ)區(qū)域分配难裆。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好子檀,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量乃戈,static變量褂痰。

2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí)症虑,函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建缩歪,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集谍憔。

3) 從堆上分配匪蝙,亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc 或new申請(qǐng)任意多少的內(nèi)存习贫,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存逛球。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活苫昌,但問(wèn)題也最多颤绕。

29.struct 和 class 的區(qū)別

struct 的成員默認(rèn)是公有的,而類(lèi)的成員默認(rèn)是私有的祟身。

struct 和 class 在其他方面是功能相當(dāng)?shù)陌挛瘛母星樯现v,大多數(shù)的開(kāi)發(fā)者感到類(lèi)和結(jié)構(gòu)有很大的差別袜硫。感覺(jué)上結(jié)構(gòu)僅僅象一堆缺乏封裝和功能的開(kāi)放的內(nèi)存位氯葬,而類(lèi)就象活的并且可靠的社會(huì)成員,它有智能服務(wù)父款,有牢固的封裝屏障和一個(gè)良好定義的接口溢谤。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類(lèi)有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)時(shí)憨攒,你也許應(yīng)該使用struct關(guān)鍵字世杀,否則,你應(yīng)該使用class關(guān)鍵字肝集。

30.當(dāng)一個(gè)類(lèi)A中沒(méi)有任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值是多少瞻坝?

答案:空類(lèi)大小等于1,是因?yàn)榫幾g器為了區(qū)分不同的類(lèi)杏瞻,在類(lèi)中加的一個(gè)char型所刀。

31. 在8086 匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的捞挥?(Intel)

答案:通用寄存器給出的地址浮创,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄存器內(nèi)地址砌函,就得到了真正要訪(fǎng)問(wèn)的地址斩披。

32. 比較C++中的4種類(lèi)型轉(zhuǎn)換方式?

C++中的4種類(lèi)型轉(zhuǎn)換方式

static_cast 靜態(tài)的_cast?

dynamic_cast 動(dòng)態(tài)的_cast?

reinterpret_cast 重新解釋的 _cast?

const_cast 常量的_cast?

C++ 里最好杜絕使用 C 方式的強(qiáng)制轉(zhuǎn)換, 換用以上 4 個(gè).?

我們通常用的是 static_cast?

在一類(lèi)東西都可以轉(zhuǎn), 但是不是一類(lèi)的就不能轉(zhuǎn).?

即, 語(yǔ)義上說(shuō)不通的, 兩個(gè)完全不同的數(shù)據(jù)類(lèi)型 static_cast?

是拒絕工作的.?

比如你想把一個(gè)指針轉(zhuǎn)成浮點(diǎn)數(shù),?

或者想把 class A * 轉(zhuǎn)成 class B * , 但是 class A 和 class B?

又沒(méi)有任何關(guān)系. 等等....?

static_cast 在通過(guò)編譯后, 空間和時(shí)間效率實(shí)際等價(jià)于 C 方式強(qiáng)制轉(zhuǎn)換.?

都是編譯時(shí)決定的.?

dynamic_cast 類(lèi)似 static_cast, 但是在一顆類(lèi)繼承樹(shù)上轉(zhuǎn)換時(shí),?

將利用 RTTI 在運(yùn)行時(shí)檢查. 我們一般用于 downcast?

比如,?

class A {};?

class B : public A {};?

A* a=new B();?

這個(gè)時(shí)候, 可以用 dynamic_cast 做 downcast, 把 a 轉(zhuǎn)成 B*.?

和 static_cast 不同, dynamic_cast 會(huì)檢查一下 a 到底是不是指向一個(gè)?

B, (利用了 RTTI) 如果轉(zhuǎn)不了, 將返回一個(gè) NULL.?

reinterpret_cast 就比 static_cast 更接近 C 的強(qiáng)制轉(zhuǎn)換了.?

它更進(jìn)一步的, 實(shí)現(xiàn)一些看起來(lái)沒(méi)關(guān)系的兩種類(lèi)型轉(zhuǎn)換.?

比如我習(xí)慣干的, 把一個(gè) void * 轉(zhuǎn)成 unsigned ;)?

當(dāng)然它比 static_cast 危險(xiǎn).?

但是有 reinterpret_cast 干不了的,?

比如你在一個(gè) const 成員函數(shù)里企圖修改一個(gè)非 mutable 的成員變量.?

編譯器會(huì)對(duì)你咆哮, "不許動(dòng), 那玩意是我 const 住的, 把你的爪子?

收回去" 這個(gè)時(shí)候就要利用 const_cast 了, 呵呵.?

const_cast 就是可以解除 const 限制的"神"的武器?

但我認(rèn)為, 這在很多情況下比 reinterpret_cast 更危險(xiǎn), 我還是老實(shí)做?

人的好. 讓編譯器來(lái)捍衛(wèi)我的代碼的安全.

http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx

33.分別寫(xiě)出BOOL,int,float,指針類(lèi)型的變量a與“零”的比較語(yǔ)句讹俊。

答案:

BOOL : if ( !a ) or if(a)

int : if ( a == 0)

float: const EXPRESSION EXP=0.000001

if(a-EXP)

pointer : if ( a != NULL) or if(a == NULL)

34.請(qǐng)說(shuō)出const與#define相比垦沉,有何優(yōu)點(diǎn)?

<1>const常量有數(shù)據(jù)類(lèi)型仍劈,而宏常量沒(méi)有數(shù)據(jù)類(lèi)型厕倍,編譯器可以對(duì)前者進(jìn)行類(lèi)型安全檢查,而對(duì)后者只進(jìn)行字符替換贩疙,并且在字符替換時(shí)會(huì)發(fā)生意料不到的錯(cuò)誤

<2>有些集成化的調(diào)試工具可以對(duì)const常量進(jìn)行調(diào)試讹弯,但是不能對(duì)紅常量進(jìn)行調(diào)試

35.簡(jiǎn)述數(shù)組與指針的區(qū)別?

數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組)这溅,要么在棧上被創(chuàng)建闸婴。指針可以隨時(shí)指向任意類(lèi)型的內(nèi)存塊。

(1)修改內(nèi)容上的差別

char a[] = “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)型的指針吕晌。

char a[] = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12 字節(jié)

cout<< sizeof(p) << endl; // 4 字節(jié)

計(jì)算數(shù)組和指針的內(nèi)存容量

void Func(char a[100])

{

cout<< sizeof(a) << endl; // 4 字節(jié)而不是100 字節(jié)

}

36.類(lèi)成員函數(shù)的重載、覆蓋和隱藏區(qū)別临燃?

a.成員函數(shù)被重載的特征:

(1)相同的范圍(在同一個(gè)類(lèi)中)睛驳;

(2)函數(shù)名字相同烙心;

(3)參數(shù)不同;

(4)virtual 關(guān)鍵字可有可無(wú)乏沸。

b.覆蓋是指派生類(lèi)函數(shù)覆蓋基類(lèi)函數(shù)淫茵,特征是:

(1)不同的范圍(分別位于派生類(lèi)與基類(lèi));

(2)函數(shù)名字相同蹬跃;

(3)參數(shù)相同匙瘪;

(4)基類(lèi)函數(shù)必須有virtual 關(guān)鍵字。

c.“隱藏”是指派生類(lèi)的函數(shù)屏蔽了與其同名的基類(lèi)函數(shù)蝶缀,規(guī)則如下:

(1)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名丹喻,但是參數(shù)不同。此時(shí)翁都,不論有無(wú)virtual關(guān)鍵字碍论,基類(lèi)的函數(shù)將被隱藏(注意別與重載混淆)。

(2)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名柄慰,并且參數(shù)也相同骑冗,但是基類(lèi)函數(shù)沒(méi)有virtual 關(guān)鍵字。此時(shí)先煎,基類(lèi)的函數(shù)被隱藏(注意別與覆蓋混淆)

37.求出兩個(gè)數(shù)中的較大者

答案:( ( a + b ) + abs( a - b ) ) / 2

38.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)贼涩?

答案:

cout << __FILE__ ;

cout<<__LINE__ ;

__FILE__和__LINE__是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的薯蝎,而是由編譯器定義的遥倦。

39. main主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼占锯,給出說(shuō)明袒哥?

答案:可以,可以用_onexit注冊(cè)一個(gè)函數(shù)消略,它會(huì)在main之后執(zhí)行int fn1(void), fn2(void), fn3(void), fn4 (void);

void main( void )

{

? ? ? String str("zhanglin");

? ? ? _onexit( fn1 );

? ? ? _onexit( fn2 );

? ? ? _onexit( fn3 );

? ? ? _onexit( fn4 );

? ? ? printf( "This is executed first.n" );

}

int fn1()

{

? ? ? printf( "next.n" );

? ? ? return 0;

}

int fn2()

{

? ? ? printf( "executed " );

? ? ? return 0;

}

int fn3()

{

? ? ? printf( "is " );

? ? ? return 0;

}

int fn4()

{

? ? ? printf( "This " );

? ? ? return 0;

}

The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.

40.如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的堡称?

#ifdef __cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

41.文件中有一組整數(shù),要求排序后輸出到另一個(gè)文件中

#include<iostream>

#include<fstream>

#include <vector>

using namespace std;

void Order(vector<int>& data) //bubble sort

{

int count = data.size();

int tag = false; // 設(shè)置是否需要繼續(xù)冒泡的標(biāo)志位

for ( int i = 0 ; i < count ; i++)

{

for ( int j = 0 ; j < count - i - 1 ; j++)

{

if ( data[j] > data[j+1])

{

? ? ? tag = true ;

? ? ? int temp = data[j] ;

? ? ? data[j] = data[j+1] ;

? ? ? data[j+1] = temp ;

}

}

if ( !tag )

break ;

}

}

void main( void )

{

? ? ? vector<int>data;

? ? ? ifstream in("data.txt");

? ? ? if ( !in)

? ? ? {

? ? ? ? ? ? ? cout<<"file error!";

? ? ? ? ? ? ? exit(1);

? ? ? }

? ? ? int temp;

? ? ? while (!in.eof())

? ? ? {

? ? ? ? ? ? ? in>>temp;

? ? ? ? ? ? ? data.push_back(temp);

? ? ? }

? ? ? in.close(); //關(guān)閉輸入文件流

? ? ? Order(data);

? ? ? ofstream out("result.txt");

? ? ? if ( !out)

? ? ? {

? ? ? ? ? ? ? cout<<"file error!";

? ? ? ? ? ? ? exit(1);

? ? ? }

? ? ? for ( int i = 0 ; i < data.size() ; i++)

? ? ? ? ? ? ? out<<data[i]<<" ";

? ? ? out.close(); //關(guān)閉輸出文件流

}

42.鏈表題:一個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)

struct Node

{

int data ;

Node *next ;

};

typedef struct Node Node ;

(1)已知鏈表的頭結(jié)點(diǎn)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序 ( Intel)

Node * ReverseList(Node *head) //鏈表逆序

{

? ? ? if ( head == NULL || head->next == NULL )

? ? ? ? ? ? ? return head;

? ? ? 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 ;

? ? ? return head ;

}

(2)已知兩個(gè)鏈表head1 和head2 各自有序艺演,請(qǐng)把它們合并成一個(gè)鏈表依然有序却紧。(保留所有結(jié)點(diǎn),即便大小相同)

Node * Merge(Node *head1 , Node *head2)

{

if ( head1 == NULL)

return head2 ;

if ( head2 == NULL)

return head1 ;

Node *head = NULL ;

Node *p1 = NULL;

Node *p2 = NULL;

if ( head1->data < head2->data )

{

head = head1 ;

p1 = head1->next;

p2 = head2 ;

}

else

{

head = head2 ;

p2 = head2->next ;

p1 = head1 ;

}

Node *pcurrent = head ;

while ( p1 != NULL && p2 != NULL)

{

? ? ? if ( p1->data <= p2->data )

? ? ? {

? ? ? ? ? ? ? pcurrent->next = p1 ;

? ? ? ? ? ? ? pcurrent = p1 ;

? ? ? ? ? ? ? p1 = p1->next ;

? ? ? }

? ? ? else

? ? ? {

? ? ? ? ? ? ? pcurrent->next = p2 ;

? ? ? ? ? ? ? pcurrent = p2 ;

? ? ? ? ? ? ? p2 = p2->next ;

? ? ? }

}

if ( p1 != NULL )

pcurrent->next = p1 ;

if ( p2 != NULL )

pcurrent->next = p2 ;

return head ;

}

(3)已知兩個(gè)鏈表head1 和head2 各自有序胎撤,請(qǐng)把它們合并成一個(gè)鏈表依然有序晓殊,這次要求用遞歸方法進(jìn)行。 (Autodesk)

答案:

Node * MergeRecursive(Node *head1 , Node *head2)

{

? ? ? if ( head1 == NULL )

? ? ? ? ? ? ? return head2 ;

? ? ? if ( head2 == NULL)

? ? ? ? ? ? ? return head1 ;

? ? ? 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);

? ? ? }

? ? ? return head ;

}

41. 分析一下這段程序的輸出 (Autodesk)

class B

{

public:

? ? ? B()

? ? ? {

? ? ? ? ? ? ? cout<<"default constructor"<<endl;

? ? ? }

? ? ? ~B()

? ? ? {

? ? ? ? ? ? ? cout<<"destructed"<<endl;

? ? ? }

? ? ? B(int i):data(i)? ? //B(int) works as a converter ( int -> instance of? B)

? ? ? {

? ? ? ? ? ? ? cout<<"constructed by parameter " << data <<endl;

? ? ? }

private:

? ? ? int data;

};

B Play( B b)

{

? ? ? return b ;

}

(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? results:

int main(int argc, char* argv[])constructed by parameter 5

{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? destructed? B(5)形參析構(gòu)

B t1 = Play(5); B t2 = Play(t1);destructed? t1形參析構(gòu)

return 0;            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); B t2 = Play(10);constructed by parameter 10

return 0;            destructed? B(10)形參析構(gòu)

}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? destructed? t2 注意順序巫俺!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? destructed? t1

43.寫(xiě)一個(gè)函數(shù)找出一個(gè)整數(shù)數(shù)組中,第二大的數(shù) (microsoft)

const int MINNUMBER = -32767 ;

int find_sec_max( int data[] , int count)

{

? ? ? int maxnumber = data[0] ;

? ? ? int sec_max = MINNUMBER ;

? ? ? for ( int i = 1 ; i < count ; i++)

? ? ? {

? ? ? ? ? ? ? if ( data[i] > maxnumber )

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? sec_max = maxnumber ;

? ? ? ? ? ? ? ? ? ? maxnumber = data[i] ;

? ? ? ? ? ? ? }

? ? ? ? ? ? ? else

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if ( data[i] > sec_max )

? ? ? ? ? ? ? ? ? ? ? ? ? ? sec_max = data[i] ;

? ? ? ? ? ? ? }

? ? ? }

? ? ? return sec_max ;

}

44.寫(xiě)一個(gè)在一個(gè)字符串(n)中尋找一個(gè)子串(m)第一個(gè)位置的函數(shù)肿男。

KMP算法

46.多重繼承的內(nèi)存分配問(wèn)題

http://blog.csdn.net/rainlight/archive/2006/03/03/614792.aspx

47.如何判斷一個(gè)單鏈表是有環(huán)的介汹?(注意不能用標(biāo)志位却嗡,最多只能用兩個(gè)額外指針)

struct node { char val; node* next;}

bool check(const node* head)

{

? ? if(head==NULL)? return false;

? ? node *low=head, *fast=head->next;

? ? while(fast!=NULL && fast->next!=NULL)

? ? {

? ? ? ? low=low->next;

? ? ? ? fast=fast->next->next;

? ? ? ? if(low==fast) return true;

? ? }

? ? return false;

}

48.指針找錯(cuò)題

試題1:

以下是引用片段:

void test1()?

{

  char string[10];

  char* str1 = "0123456789";

  strcpy( string, str1 );

}

試題2:

以下是引用片段:

void test2()

{

  char string[10], str1[10];

  int i;

  for(i=0; i<10; i++)

  {

   str1= 'a';

  }

  strcpy( string, str1 );

}

試題3:

以下是引用片段:

void test3(char* str1)

{

  char string[10];

  if( strlen( str1 ) <= 10 )

  {

   strcpy( string, str1 );

  }

}

解答:

試題1字符串str1需要11個(gè)字節(jié)才能存放下(包括末尾的’/0’),而string只有10個(gè)字節(jié)的空間嘹承,strcpy會(huì)導(dǎo)致數(shù)組越界;

對(duì)試題2窗价,指出庫(kù)函數(shù)strcpy工作方式

對(duì)試題3,if(strlen(str1) <= 10)應(yīng)改為if(strlen(str1) <10)赶撰,因?yàn)閟trlen的結(jié)果未統(tǒng)計(jì)’/0’所占用的1個(gè)字節(jié)舌镶。

  (1)字符串以’/0’結(jié)尾;

  (2)對(duì)數(shù)組越界把握的敏感度;

  (3)庫(kù)函數(shù)strcpy的工作方式

49.如果編寫(xiě)一個(gè)標(biāo)準(zhǔn)strcpy函數(shù)

總分值為10柱彻,下面給出幾個(gè)不同得分的答案:

2分 以下是引用片段:

void strcpy( char *strDest, char *strSrc )

{

  while( (*strDest++ = * strSrc++) != ‘/0’ );

}

  4分 以下是引用片段:

void strcpy( char *strDest, const char *strSrc )

  //將源字符串加const豪娜,表明其為輸入?yún)?shù),加2分

{

  while( (*strDest++ = * strSrc++) != ‘/0’ );

}

  7分 以下是引用片段:

void strcpy(char *strDest, const char *strSrc)

{

  //對(duì)源地址和目的地址加非0斷言哟楷,加3分

  assert( (strDest != NULL) &&(strSrc != NULL) );

  while( (*strDest++ = * strSrc++) != ‘/0’ );

}

  10分 以下是引用片段:

//為了實(shí)現(xiàn)鏈?zhǔn)讲僮髁鲈兀瑢⒛康牡刂贩祷兀?分!

char * strcpy( char *strDest, const char *strSrc )

{

  assert( (strDest != NULL) &&(strSrc != NULL) );

  char *address = strDest;

  while( (*strDest++ = * strSrc++) != ‘/0’ );

  return address;

}

讀者看了不同分值的strcpy版本卖擅,應(yīng)該也可以寫(xiě)出一個(gè)10分的strlen函數(shù)了鸣奔,完美的版本為:

int strlen( const char *str ) //輸入?yún)?shù)const 以下是引用片段:

{

  assert( str != NULL ); //斷言字符串地址非0

  int len=0; //注,一定要初始化惩阶。

  while( (*str++) != '/0' )

  {

   len++;

  }

  return len;

}

試題4:以下是引用片段:

void GetMemory( char *p )

{

  p = (char *) malloc( 100 );

}

void Test( void )

{

  char *str = NULL;

  GetMemory( str );

  strcpy( str, "hello world" );

  printf( str );

}

試題5:

以下是引用片段:

char *GetMemory( void )

{

  char p[] = "hello world";

  return p;

}

void Test( void )

{

  char *str = NULL;

  str = GetMemory();

  printf( str );

}

試題6:以下是引用片段:

void GetMemory( char **p, int num )

{

  *p = (char *) malloc( num );

}

void Test( void )

{

  char *str = NULL;

  GetMemory( &str, 100 );

  strcpy( str, "hello" );

  printf( str );

}

試題7:以下是引用片段:

void Test( void )

{

  char *str = (char *) malloc( 100 );

  strcpy( str, "hello" );

  free( str );

  ... //省略的其它語(yǔ)句

}

解答:

試題4傳入中GetMemory( char *p )函數(shù)的形參為字符串指針挎狸,在函數(shù)內(nèi)部修改形參并不能真正的改變傳入形參的值,

執(zhí)行完后的str仍然為NULL;

試題5中

  char p[] = "hello world";

  return p;

  的p[]數(shù)組為函數(shù)內(nèi)的局部自動(dòng)變量窿凤,在函數(shù)返回后拿撩,內(nèi)存已經(jīng)被釋放剩愧。這是許多程序員常犯的錯(cuò)誤,其根源在于不理解變量的生存期恐锣。

試題6的GetMemory避免了試題4的問(wèn)題,傳入GetMemory的參數(shù)為字符串指針的指針舞痰,但是在GetMemory中執(zhí)行申請(qǐng)內(nèi)存及賦值語(yǔ)句

  *p = (char *) malloc( num );

  后未判斷內(nèi)存是否申請(qǐng)成功土榴,而且未對(duì)malloc的內(nèi)存進(jìn)行釋放

試題7存在與試題6同樣的問(wèn)題,在執(zhí)行

  char *str = (char *) malloc(100);

  后未進(jìn)行內(nèi)存是否申請(qǐng)成功的判斷;另外响牛,在free(str)后未置str為空玷禽,導(dǎo)致可能變成一個(gè)“野”指針,應(yīng)加上:

  str = NULL;

  剖析:

試題4~7考查面試者對(duì)內(nèi)存操作的理解程度呀打,基本功扎實(shí)的面試者一般都能正確的回答其中50~60的錯(cuò)誤论衍。但是要完全解答正確,卻也絕非易事聚磺。

  對(duì)內(nèi)存操作的考查主要集中在:

  (1)指針的理解;

  (2)變量的生存期及作用范圍;

  (3)良好的動(dòng)態(tài)內(nèi)存申請(qǐng)和釋放習(xí)慣坯台。

  再看看下面的一段程序有什么錯(cuò)誤:

以下是引用片段:

swap( int* p1,int* p2 )

{

  int *p;

  *p = *p1;

  *p1 = *p2;

  *p2 = *p;

}

  在swap函數(shù)中,p是一個(gè)“野”指針瘫寝,有可能指向系統(tǒng)區(qū)蜒蕾,導(dǎo)致程序運(yùn)行的崩潰稠炬。在VC++中DEBUG運(yùn)行時(shí)提示錯(cuò)誤“Access Violation”。該程序應(yīng)該改為

以下是引用片段:

swap( int* p1,int* p2 )

{

  int p;

  p = *p1;

  *p1 = *p2;

  *p2 = p;

}

50.String 的具體實(shí)現(xiàn)

已知String類(lèi)定義如下:

class String

{

public:

? ? ? String(const char *str = NULL); // 通用構(gòu)造函數(shù)

? ? ? String(const String &another); // 拷貝構(gòu)造函數(shù)

? ? ? ~ String(); // 析構(gòu)函數(shù)

? ? ? String & operater =(const String &rhs); // 賦值函數(shù)

private:

? ? ? char *m_data; // 用于保存字符串

};

嘗試寫(xiě)出類(lèi)的成員函數(shù)實(shí)現(xiàn)

答案:

String::String(const char *str)

{

? ? ? if ( str == NULL ) //strlen在參數(shù)為NULL時(shí)會(huì)拋異常才會(huì)有這步判斷

? ? ? {

? ? ? ? ? ? ? m_data = new char[1] ;

? ? ? ? ? ? ? m_data[0] = '/0' ;

? ? ? }

? ? ? else

? ? ? {

? ? ? ? ? ? ? m_data = new char[strlen(str) + 1];

? ? ? ? ? ? ? strcpy(m_data,str);

? ? ? }

}

String::String(const String &another)

{

? ? ? m_data = new char[strlen(another.m_data) + 1];

? ? ? strcpy(m_data,another.m_data);

}

String& String::operator =(const String &rhs)

{

? ? ? if ( this == &rhs)

? ? ? ? ? ? ? return *this ;

? ? ? delete []m_data; //刪除原來(lái)的數(shù)據(jù)咪啡,新開(kāi)一塊內(nèi)存

? ? ? m_data = new char[strlen(rhs.m_data) + 1];

? ? ? strcpy(m_data,rhs.m_data);

? ? ? return *this ;

}

String::~String()

{

? ? ? delete []m_data ;

}

51.h頭文件中的ifndef/define/endif 的作用首启?

答:防止該頭文件被重復(fù)引用。

52.#include 與 #include "file.h"的區(qū)別撤摸?

答:前者是從Standard Library的路徑尋找和引用file.h毅桃,而后者是從當(dāng)前工作路徑搜尋并引用file.h。

53.在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù)准夷,為什么要加extern “C”钥飞?

C++語(yǔ)言支持函數(shù)重載,C語(yǔ)言不支持函數(shù)重載衫嵌。C++提供了C連接交換指定符號(hào)extern “C”

解決名字匹配問(wèn)題读宙。

首先,作為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"是連接申明(linkage declaration),被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ù)的原型為:

void foo( int x, int y );

該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int之類(lèi)的名字(不同的編譯器可能生成的名字不同蜂厅,但是都采用了相同的機(jī)制匪凡,生成的新名字稱(chēng)為“mangled name”)。

_foo_int_int 這樣的名字包含了函數(shù)名掘猿、函數(shù)參數(shù)數(shù)量及類(lèi)型信息病游,C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。例如,在C++中衬衬,函數(shù)void foo( int x, int y )與void foo( int x, float y )編譯生成的符號(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ù)程序中同名的全局變量名字不同耽梅。

未加extern "C"聲明時(shí)的連接方式

假設(shè)在C++中薛窥,模塊A的頭文件如下:

// 模塊A頭文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

int foo( int x, int y );

#endif

在模塊B中引用該函數(shù):

// 模塊B實(shí)現(xiàn)文件 moduleB.cpp

#include "moduleA.h"

foo(2,3);

加extern "C"聲明后的編譯和連接方式

加extern "C"聲明后胖烛,模塊A的頭文件變?yōu)椋?/p>

// 模塊A頭文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

extern "C" int foo( int x, int y );

#endif

在模塊B的實(shí)現(xiàn)文件中仍然調(diào)用foo( 2,3 )眼姐,其結(jié)果是:

(1)模塊A編譯生成foo的目標(biāo)代碼時(shí),沒(méi)有對(duì)其名字進(jìn)行特殊處理佩番,采用了C語(yǔ)言的方式众旗;

(2)連接器在為模塊B的目標(biāo)代碼尋找foo(2,3)調(diào)用時(shí),尋找的是未經(jīng)修改的符號(hào)名_foo趟畏。

如果在模塊A中函數(shù)聲明了foo為extern "C"類(lèi)型贡歧,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數(shù)赋秀;反之亦然利朵。

所以,可以用一句話(huà)概括extern “C”這個(gè)聲明的真實(shí)目的(任何語(yǔ)言中的任何語(yǔ)法特性的誕生都不是隨意而為的猎莲,來(lái)源于真實(shí)世界的需求驅(qū)動(dòng)绍弟。我們?cè)谒伎紗?wèn)題時(shí),不能只停留在這個(gè)語(yǔ)言是怎么做的著洼,還要問(wèn)一問(wèn)它為什么要這么做樟遣,動(dòng)機(jī)是什么,這樣我們可以更深入地理解許多問(wèn)題):實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程身笤。

明白了C++中extern "C"的設(shè)立動(dòng)機(jī)豹悬,我們下面來(lái)具體分析extern "C"通常的使用技巧:

extern "C"的慣用法

(1)在C++中引用C語(yǔ)言中的函數(shù)和變量,在包含C語(yǔ)言頭文件(假設(shè)為cExample.h)時(shí)液荸,需進(jìn)行下列處理:

extern "C"

{

#include "cExample.h"

}

而在C語(yǔ)言的頭文件中瞻佛,對(duì)其外部函數(shù)只能指定為extern類(lèi)型,C語(yǔ)言中不支持extern "C"聲明娇钱,在.c文件中包含了extern "C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤伤柄。

C++引用C函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:

/* c語(yǔ)言頭文件:cExample.h */

#ifndef C_EXAMPLE_H

#define C_EXAMPLE_H

extern int add(int x,int y);

#endif

/* c語(yǔ)言實(shí)現(xiàn)文件:cExample.c */

#i nclude "cExample.h"

int add( int x, int y )

{

return x + y;

}

// c++實(shí)現(xiàn)文件涡尘,調(diào)用add:cppFile.cpp

extern "C"

{

#i nclude "cExample.h"

}

int main(int argc, char* argv[])

{

add(2,3);

return 0;

}

如果C++調(diào)用一個(gè)C語(yǔ)言編寫(xiě)的.DLL時(shí),當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時(shí)响迂,應(yīng)加extern "C" { }考抄。

(2)在C中引用C++語(yǔ)言中的函數(shù)和變量時(shí),C++的頭文件需添加extern "C"蔗彤,但是在C語(yǔ)言中不能直接引用聲明了extern "C"的該頭文件川梅,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類(lèi)型。

C引用C++函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:

//C++頭文件 cppExample.h

#ifndef CPP_EXAMPLE_H

#define CPP_EXAMPLE_H

extern "C" int add( int x, int y );

#endif

//C++實(shí)現(xiàn)文件 cppExample.cpp

#i nclude "cppExample.h"

int add( int x, int y )

{

return x + y;

}

/* C實(shí)現(xiàn)文件 cFile.c

/* 這樣會(huì)編譯出錯(cuò):#i nclude "cExample.h" */

int main( int argc, char* argv[] )

{

add( 2, 3 );

return 0;

}

1.

What is displayed when f() is called given the code:

class Number {

public:

string type;

Number(): type(“void”) { }

explicit Number(short) : type(“short”) { }

Number(int) : type(“int”) { }

};

void Show(const Number& n) { cout << n.type; }

void f()

{

short s = 42;

Show(s);

}

a) void

b) short

c) int

d) None of the above

2. Which is the correct output for the following code

double dArray[2] = {4, 8}, *p, *q;

p = &dArray[0];

q = p + 1;

cout << q – p << endl;

cout << (int)q - (int)p << endl;

a) 1 and 8

b) 8 and 4

c) 4 and 8

d) 8 and 1

第一個(gè)選C然遏;

雖然傳入的是short類(lèi)型贫途,但是short類(lèi)型的構(gòu)造函數(shù)被生命被explicit,也就是只能顯示類(lèi)型轉(zhuǎn)換待侵,不能使用隱式類(lèi)型轉(zhuǎn)換丢早。

第二個(gè)選A;

第一個(gè)是指針加減秧倾,按照的是指向地址類(lèi)型的加減怨酝,只跟類(lèi)型位置有關(guān),q和p指向的數(shù)據(jù)類(lèi)型以實(shí)際數(shù)據(jù)類(lèi)型來(lái)算差一個(gè)位置那先,因此是1农猬。而第二個(gè)加減是實(shí)際指針值得加減,在內(nèi)存中一個(gè)double類(lèi)型占據(jù)8個(gè)字節(jié)售淡,因此是8

55請(qǐng)你分別畫(huà)出OSI的七層網(wǎng)絡(luò)結(jié)構(gòu)圖和TCP/IP的五層結(jié)構(gòu)圖斤葱。

http://www.cnblogs.com/yuyue/articles/1732111.html

56請(qǐng)你詳細(xì)地解釋一下IP協(xié)議的定義,在哪個(gè)層上面揖闸?主要有什么作用揍堕?TCP與UDP呢 ?

同55

57.請(qǐng)問(wèn)交換機(jī)和路由器各自的實(shí)現(xiàn)原理是什么汤纸?分別在哪個(gè)層次上面實(shí)現(xiàn)的衩茸?

交換機(jī):數(shù)據(jù)鏈路層。路由器:網(wǎng)絡(luò)層蹲嚣。

58.全局變量和局部變量有什么區(qū)別递瑰?是怎么實(shí)現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的隙畜?

全局變量和局部變量的區(qū)別主要在于生存周期不同抖部,全局變量在整個(gè)程序生成期間可見(jiàn),局部變量在自己的作用域內(nèi)可見(jiàn)议惰。全局變量的內(nèi)存分配是靜態(tài)的慎颗,位于PE文件在數(shù)據(jù)區(qū),在main()前由C、C++運(yùn)行期函數(shù)初始化俯萎,如果沒(méi)有初值傲宜,會(huì)被初始化為0。局部變量的內(nèi)存分配是動(dòng)態(tài)的夫啊,位于線(xiàn)程堆棧中函卒。如果沒(méi)有初始化的,初值視當(dāng)前內(nèi)存內(nèi)的值而定撇眯。

操作系統(tǒng)和編譯器從定義變量為變量分配內(nèi)存時(shí),從變量的定義和存儲(chǔ)區(qū)域來(lái)分別局部變量和全局變量

59.Windows程序的入口是哪里报嵌?寫(xiě)出Windows消息機(jī)制的流程。

入口在main()/WinMain()

<1>操作系統(tǒng)接收應(yīng)用程序的窗口消息熊榛,將消息投遞到該應(yīng)用程序的消息隊(duì)列中

<2>應(yīng)用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊(duì)列中取出一條一條的消息锚国,取出消息后,應(yīng)用程序可以對(duì)消息進(jìn)行一些預(yù)處理

<3>應(yīng)用程序調(diào)用DispatchMessage玄坦,將消息回傳給操作系統(tǒng)

<4>系統(tǒng)利用WNDCLASS結(jié)構(gòu)體的ipfoWndProc成員保存的窗口過(guò)程函數(shù)的指針調(diào)用窗口過(guò)程血筑,對(duì)消息進(jìn)行處理

60.解釋局部變量、全局變量和靜態(tài)變量的含義煎楣。

局部變量:在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量豺总,它只在本函數(shù)范圍內(nèi)有效,也就是說(shuō)只有在本函數(shù)內(nèi)才能使用它們转质,在此函數(shù)以外時(shí)不能使用這些變量的园欣,它們稱(chēng)為局部變量帖世;

說(shuō)明:

1.主函數(shù)main中定義的變量也只在主函數(shù)中有效休蟹,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效

2.不同函數(shù)中可以使用名字相同的變量,它們代表不同的對(duì)象日矫,互不干擾

3.形式參數(shù)也使局部變量

4.在一個(gè)函數(shù)內(nèi)部赂弓,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本符合語(yǔ)句中有效

全局變量:在函數(shù)外定義的變量是外部變量哪轿,外部變量是全局變量盈魁,全局變量可以為本文件中其它函數(shù)所共用,它的有效范圍從定義變量的位置開(kāi)始到本源文件結(jié)束窃诉;

說(shuō)明:

1.設(shè)全局變量的作用:增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道

2.建議不再必要的時(shí)候不要使用全局變量杨耙,因?yàn)?/p>

a.全局變量在程序的全部執(zhí)行過(guò)程中都占用存儲(chǔ)單元;

b.它使函數(shù)的通用性降低了

c.使用全局變量過(guò)多飘痛,會(huì)降低程序的清晰性

3.如果外部變量在文件開(kāi)頭定義珊膜,則在整個(gè)文件范圍內(nèi)都可以使用該外部變量,如果不再文件開(kāi)頭定義宣脉,按上面規(guī)定作用范圍只限于定義點(diǎn)到文件終了车柠。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在該函數(shù)中用關(guān)鍵字extern作外部變量說(shuō)明

4.如果在同一個(gè)源文件中,外部變量與局部變量同名竹祷,則在局部變量的作用范圍內(nèi)谈跛,外部變量不起作用;

靜態(tài)變量:在程序運(yùn)行期間分配固定的存儲(chǔ)空間的變量塑陵,叫做靜態(tài)變量

61.論述含參數(shù)的宏與函數(shù)的優(yōu)缺點(diǎn)

1.函數(shù)調(diào)用時(shí)感憾,先求出實(shí)參表達(dá)式的值,然后帶入形參令花。而使用帶參的宏只是進(jìn)行簡(jiǎn)單的字符替換吹菱。

2.函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,分配臨時(shí)的內(nèi)存單元彭则;而宏展開(kāi)則是在編譯時(shí)進(jìn)行的鳍刷,在展開(kāi)時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理俯抖,也沒(méi)有“返回值”的概念输瓜。

3.對(duì)函數(shù)中的實(shí)參和形參都要定義類(lèi)型,二者的類(lèi)型要求一致芬萍,如不一致尤揣,應(yīng)進(jìn)行類(lèi)型轉(zhuǎn)換;而宏不存在類(lèi)型問(wèn)題柬祠,宏名無(wú)類(lèi)型北戏,它的參數(shù)也無(wú)類(lèi)型,只是一個(gè)符號(hào)代表漫蛔,展開(kāi)時(shí)帶入指定的字符即可嗜愈。宏定義時(shí),字符串可以是任何類(lèi)型的數(shù)據(jù)莽龟。

4.調(diào)用函數(shù)只可得到一個(gè)返回值蠕嫁,而用宏可以設(shè)法得到幾個(gè)結(jié)果。

5.使用宏次數(shù)多時(shí)毯盈,宏展開(kāi)后源程序長(zhǎng)剃毒,因?yàn)槊空归_(kāi)一次都使程序增長(zhǎng),而函數(shù)調(diào)用不使源程序變長(zhǎng)搂赋。

6.宏替換不占運(yùn)行時(shí)間赘阀。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)脑奠、值傳遞基公、返回)。

一般來(lái)說(shuō)捺信,用宏來(lái)代表簡(jiǎn)短的表達(dá)式比較合適

普天筆試題

1.實(shí)現(xiàn)雙向鏈表刪除一個(gè)節(jié)點(diǎn)P酌媒,在節(jié)點(diǎn)P后插入一個(gè)節(jié)點(diǎn)欠痴,寫(xiě)出這兩個(gè)函數(shù);

答:

//假設(shè)線(xiàn)性表的雙向鏈表存儲(chǔ)結(jié)構(gòu)

typedef struct DulNode{

struct DulNode *prior; //前驅(qū)指針

ElemType data;? //數(shù)據(jù)

struct DulNode *next; //后繼指針

}DulNode,*DuLinkList;

//刪除操作

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)

{

if(!(p=GetElemP_DuL(L,i))) //此處得到i位置的節(jié)點(diǎn)指針,如有需要也得寫(xiě)出具體函數(shù)實(shí)現(xiàn)

return ERROR;

e=p->data;

p->prior->next=p->next;

p->next->prior=p->prior;

free(p);

return OK;

}

//插入操作

Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)

{

if(!(p=GetElemP_DuL(L,i)))

return ERROR;

if(!(s=(DuLinkList)

malloc(sizeof(DuLNode))))

return ERROR;

s->data=e;

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

return OK;

}

C++里面是不是所有的動(dòng)作都是main()引起的秒咨?如果不是喇辽,請(qǐng)舉例

64.static有什么用途?(請(qǐng)至少說(shuō)明兩種)

<1>限制變量的作用域(文件級(jí)的)

<2>設(shè)置變量的存儲(chǔ)域(全局?jǐn)?shù)據(jù)區(qū))

65.引用與指針有什么區(qū)別雨席?

1)引用必須被初始化菩咨,指針不必

2)引用初始化以后不能被改變,指針可以改變所指的對(duì)象

3)不存在指向空值的引用陡厘,但是存在指向空值的指針

66.描述實(shí)時(shí)系統(tǒng)的基本特性

在特定時(shí)間內(nèi)完成特定的任務(wù)抽米,實(shí)時(shí)性與可靠性

67.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有糙置,是什么區(qū)別云茸?

同58

68.什么是平衡二叉樹(shù)?

左右子樹(shù)都是平衡二叉樹(shù)谤饭,且左右子樹(shù)的深度差值的絕對(duì)值不大于1

69.堆棧溢出一般是由什么原因?qū)е碌模?/p>

1.沒(méi)有回收垃圾資源

2.層次太深的遞歸調(diào)用

70.什么函數(shù)不能聲明為虛函數(shù)标捺?

一、首先回顧下什么是虛函數(shù)及其作用揉抵,以便更好理解什么函數(shù)不能聲明或定義為虛函數(shù):

1. 定義:

虛函數(shù)必須是基類(lèi)的非靜態(tài)成員函數(shù)亡容,其訪(fǎng)問(wèn)權(quán)限可以是protected或public,在基類(lèi)的類(lèi)定義中定義虛函數(shù)的一般形式:

virtual 函數(shù)返回值類(lèi)型 虛函數(shù)名(形參表)  { 函數(shù)體 }

2. 作用:

虛函數(shù)的作用是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編冤今,也就是在程序的運(yùn)行階段動(dòng)態(tài)地選擇合適的成員函數(shù)闺兢,在定義了虛函數(shù)后,可以在基類(lèi)的派生類(lèi)中對(duì)虛函數(shù)重新定義戏罢,在派生類(lèi)中重新定義的函數(shù)應(yīng)與虛函數(shù)具有相同的形參個(gè)數(shù)和形參類(lèi)型屋谭,以實(shí)現(xiàn)統(tǒng)一的接口,不同定義過(guò)程帖汞。如果在派生類(lèi)中沒(méi)有對(duì)虛函數(shù)重新定義戴而,則它繼承其基類(lèi)的虛函數(shù)。

當(dāng)程序發(fā)現(xiàn)虛函數(shù)名前的關(guān)鍵字virtual后翩蘸,會(huì)自動(dòng)將其作為動(dòng)態(tài)聯(lián)編處理,即在程序運(yùn)行時(shí)動(dòng)態(tài)地選擇合適的成員函數(shù)淮逊。

3. 使用方法:

動(dòng)態(tài)聯(lián)編規(guī)定催首,只能通過(guò)指向基類(lèi)的指針或基類(lèi)對(duì)象的引用來(lái)調(diào)用虛函數(shù),其格式:

指向基類(lèi)的指針變量名->虛函數(shù)名(實(shí)參表)

基類(lèi)對(duì)象的引用名. 虛函數(shù)名(實(shí)參表)

4. 其它說(shuō)明:

虛函數(shù)是C++多態(tài)的一種表現(xiàn):

例如:子類(lèi)繼承了父類(lèi)的一個(gè)函數(shù)(方法)泄鹏,而我們把父類(lèi)的指針指向子類(lèi)郎任,則必須把父類(lèi)的該函數(shù)(方法)設(shè)為virtual(虛函數(shù))”缸眩  使用虛函數(shù)舶治,我們可以靈活的進(jìn)行動(dòng)態(tài)綁定分井,當(dāng)然是以一定的開(kāi)銷(xiāo)為代價(jià)。 如果父類(lèi)的函數(shù)(方法)根本沒(méi)有必要或者無(wú)法實(shí)現(xiàn)霉猛,完全要依賴(lài)子類(lèi)去實(shí)現(xiàn)的話(huà)尺锚,可以把此函數(shù)(方法)設(shè)為virtual 函數(shù)名=0 我們把這樣的函數(shù)(方法)稱(chēng)為純虛函數(shù)∠常  如果一個(gè)類(lèi)包含了純虛函數(shù)瘫辩,稱(chēng)此類(lèi)為抽象類(lèi)?。?

二坛悉、什么函數(shù)不能聲明為虛函數(shù):

一個(gè)類(lèi)中將所有的成員函數(shù)都盡可能地設(shè)置為虛函數(shù)總是有益的伐厌。?

設(shè)置虛函數(shù)須注意:?

1:只有類(lèi)的成員函數(shù)才能說(shuō)明為虛函數(shù);?

2:靜態(tài)成員函數(shù)不能是虛函數(shù)裸影;?

3:內(nèi)聯(lián)函數(shù)不能為虛函數(shù)挣轨;?

4:構(gòu)造函數(shù)不能是虛函數(shù);?

5:析構(gòu)函數(shù)可以是虛函數(shù)轩猩,而且通常聲明為虛函數(shù)刃唐。

類(lèi)里面“定義”的成員函數(shù)是內(nèi)聯(lián)的,但是仍然可以成為虛函數(shù)界轩,那么是不是可以說(shuō)“內(nèi)聯(lián)函數(shù)不能成為虛函數(shù)”這句話(huà)有問(wèn)題呢画饥,是不是應(yīng)該改成“顯式定義的內(nèi)聯(lián)函數(shù)不能成為虛函數(shù)”。比如下面這個(gè)示例程序:

#include? <iostream>

using? namespace? std;

class? Base{

? ? ? ? public:

? ? ? ? virtual? ? void? f1(){cout < < "Father " < <endl;}

? ? ? ? };

class? Drived1:public? Base{

? ? ? ? public:

? ? ? ? ? ? void? f1(){cout < < "Son1 " < <endl;}

? ? ? ? };

class? Drived2:public? Base{

? ? ? ? public:

? ? ? ? ? ? void? f1(){cout < < "Son2 " < <endl;}

? ? ? ? };

void? myPrint(Base*? pBs){

? ? ? ? pBs-> f1();

? ? ? ? }

int? main()

{

? ? Base? father;

? ? Drived1? son1;

? ? Drived2? son2;

? ? myPrint(&father);

? ? myPrint(&son1);

? ? myPrint(&son2);

? ? system( "PAUSE ");

? ? return? 0;

}

輸出:?

Father?

Son1?

Son2?

你可以發(fā)現(xiàn)浊猾,雖然f1在基類(lèi)中定義的抖甘,按理說(shuō)應(yīng)該是內(nèi)聯(lián)函數(shù),但是它仍然可以成為虛函數(shù)葫慎。

類(lèi)中定義的成員函數(shù)(函數(shù)體在類(lèi)中)能成為虛函數(shù)衔彻,大部分編譯器能夠?qū)㈦m然聲明為inline但實(shí)際上不能inline的函數(shù)自動(dòng)改為不inline的。至于編譯器會(huì)不會(huì)將inline and virtual的函數(shù)照模照樣的實(shí)現(xiàn)偷办,與編譯器及優(yōu)化方式有關(guān)艰额。

要想成為虛函數(shù),必須能夠被取到地址.內(nèi)聯(lián)函數(shù)不能被取到地址所以不能成為虛函數(shù).?

你寫(xiě)inline virtual void f(),不能保證函數(shù)f()一定是內(nèi)聯(lián)的椒涯,只能保證f()是虛函數(shù)(從而保證此函數(shù)一定不是內(nèi)聯(lián)函數(shù))?

71.冒泡排序算法的時(shí)間復(fù)雜度是什么柄沮?

o(n^2)

72.寫(xiě)出float x 與“零值”比較的if語(yǔ)句

if(x>0.000001&&x<-0.000001)

73.Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)废岂?

tcp/ip 應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層

74.Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議祖搓?

ARP(Address Resolution Protocol)(地址解析協(xié)議)

75.IP地址的編碼分為哪倆部分?

IP地址由兩部分組成湖苞,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)拯欧,不過(guò)要和子網(wǎng)掩碼按位與之后才能區(qū)分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位

76.用戶(hù)輸入M,N值珍剑,從1至N開(kāi)始順序循環(huán)數(shù)數(shù)滋捶,每數(shù)到M輸出該數(shù)值,直至全部輸出。寫(xiě)出C程序求豫。

約瑟夫問(wèn)題

77.不能做switch()的參數(shù)類(lèi)型是辖所?

switch的參數(shù)不能為實(shí)型

78.局部變量能否和全局變量重名透且?

同60

79.如何引用一個(gè)已經(jīng)定義過(guò)的全局變量七咧?

可以用引用頭文件的方式,也可以用extern關(guān)鍵字靶庙,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變量问畅,假定你將那個(gè)變量寫(xiě)錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò)六荒,如果你用extern方式引用時(shí)护姆,假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò)掏击,而在連接期間報(bào)錯(cuò)

80.全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中卵皂?為什么?

可以砚亭,在不同的C文件中以static形式來(lái)聲明同名全局變量灯变,前提是其中只有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)

81.語(yǔ)句for( 捅膘;1 添祸;)有什么問(wèn)題?它是什么意思寻仗?

和while(1)相同

82.do……while和while……do有什么區(qū)別刃泌?

答 、前一個(gè)循環(huán)一遍再判斷署尤,后一個(gè)判斷以后再循環(huán)

83.請(qǐng)寫(xiě)出下列代碼的輸出內(nèi)容

#i nclude

main()

{

int a,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printf("b耙替,c,d:%d曹体,%d俗扇,%d",b箕别,c铜幽,d);

return 0;

}?

10,12究孕,120

84.statac 全局變量啥酱、局部變量、函數(shù)與普通全局變量厨诸、局部變量、函數(shù)有什么區(qū)別禾酱?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)用中維持一份拷貝

程序的局部變量存在于(堆棧)中俭尖,全局變量存在于(靜態(tài)區(qū) )中氢惋,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于( 堆)中。

85.設(shè)有以下說(shuō)明和定義:

typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

DATE max;

則語(yǔ)句 printf("%d",sizeof(struct date)+sizeof(max));的執(zhí)行結(jié)果是稽犁?

答 焰望、結(jié)果是:___52____。DATE是一個(gè)union, 變量公用空間. 里面最大的變量類(lèi)型是int[5], 占用20個(gè)字節(jié). 所以它的大小是20

data是一個(gè)struct, 每個(gè)變量分開(kāi)占用空間. 依次為int4 + DATE20 + double8 = 32.

所以結(jié)果是 20 + 32 = 52.

當(dāng)然...在某些16位編輯器下, int可能是2字節(jié),那么結(jié)果是 int2 + DATE10 + double8 = 20

86.-1,2,7,28,,126請(qǐng)問(wèn)28和126中間那個(gè)數(shù)是什么已亥?為什么熊赖?

答 、應(yīng)該是4^3-1=63

規(guī)律是n^3-1(當(dāng)n為偶數(shù)0虑椎,2震鹉,4)

n^3+1(當(dāng)n為奇數(shù)1俱笛,3,5)

87.用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能传趾?要求給出算法和思路迎膜!

設(shè)2個(gè)棧為A,B, 一開(kāi)始均為空.

將新元素push入棧A;

(1)判斷棧B是否為空;

(2)如果不為空浆兰,則將棧A中所有元素依次pop出并push到棧B磕仅;

(3)將棧B的棧頂元素pop出;

88.在c語(yǔ)言庫(kù)函數(shù)中將一個(gè)字符轉(zhuǎn)換成長(zhǎng)整型的函數(shù)是atol()嗎?

答 簸呈、函數(shù)名: atol

功 能: 把字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)

用 法: long atoi(const char *nptr);

程序例:

#include <stdlib.h>#include <stdio.h>

int main(void)

{

? ? long l;

? ? char *str = "98765432";

? ? l = atol(str);

? ? printf("string = %s integer = %ld/n", str, l);

? ? return(0);

}

89.對(duì)于一個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)?

答 榕订、c用宏定義,c++用inline

90.用預(yù)處理指令#define 聲明一個(gè)常數(shù)蝶棋,用以表明1年中有多少秒(忽略閏年問(wèn)題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

1). #define 語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束卸亮,括號(hào)的使用,等等)

2). 懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值玩裙,因此兼贸,直接寫(xiě)出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒(méi)有代價(jià)的吃溅。

3). 意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)溶诞。

4). 如果你在你的表達(dá)式中用到UL(表示無(wú)符號(hào)長(zhǎng)整型)螺垢,那么你有了一個(gè)好的起點(diǎn)赖歌。記住庐冯,第一印象很重要孽亲。

91.寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏MIN返劲,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。

#define MIN(A,B) ((A) <= (B) 亲配? (A) : (B))

這個(gè)測(cè)試是為下面的目的而設(shè)的:

1). 標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)菩收。這是很重要的坡贺,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分拳亿,宏是方便產(chǎn)生嵌入代碼的唯一方法肺魁,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為了能達(dá)到要求的性能瘾晃,嵌入代碼經(jīng)常是必須的方法。

2). 三重條件操作符的知識(shí)。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼偶洋,了解這個(gè)用法是很重要的。

3). 懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái)

4). 我也用這個(gè)問(wèn)題開(kāi)始討論宏的副作用

92.預(yù)處理器標(biāo)識(shí)#error的目的是什么?

死循環(huán)(Infinite loops)

93.嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán)东亦,你怎么樣用C編寫(xiě)死循環(huán)呢奋渔?

這個(gè)問(wèn)題用幾個(gè)解決方案。我首選的方案是:

while(1)

{

}

一些程序員更喜歡如下方案:

for(;;)

{

}

這個(gè)實(shí)現(xiàn)方式讓我為難,因?yàn)檫@個(gè)語(yǔ)法沒(méi)有確切表達(dá)到底怎么回事藤树。如果一個(gè)應(yīng)試者給出這個(gè)作為方案微王,我將用這個(gè)作為一個(gè)機(jī)會(huì)去探究他們這樣做的基本原理囚霸。如果他們的基本答案是:“我被教著這樣做,但從沒(méi)有想到過(guò)為什么劣挫】勘眨”這會(huì)給我留下一個(gè)壞印象拦键。

94.用變量a給出下面的定義

a) 一個(gè)整型數(shù)(An integer)

b) 一個(gè)指向整型數(shù)的指針(A pointer to an integer)

c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer)

d) 一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers)

e) 一個(gè)有10個(gè)指針的數(shù)組氧敢,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers)

f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)

g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一個(gè)有10個(gè)指針的數(shù)組的圆,該指針指向一個(gè)函數(shù)钮糖,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take an integer

argument and return an integer )

答:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

95.關(guān)鍵字static的作用是什么?

1)在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變

2)在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所有函數(shù)訪(fǎng)問(wèn)纱新,但不能被模塊外其他函數(shù)訪(fǎng)問(wèn),它是一個(gè)本地的全局變量

3)在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可能被這一模塊內(nèi)的其他函數(shù)調(diào)用,那就是导梆,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用

96.關(guān)鍵字const是什么含意?

我只要一聽(tīng)到被面試者說(shuō):“const意味著常數(shù)”躏结,我就知道我正在和一個(gè)業(yè)余者打交道兆览。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法子巾,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒(méi)有讀到那篇文章,只要能說(shuō)出const意味著“只讀”就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為一個(gè)正確的答案髓削。(如果你想知道更詳細(xì)的答案梯码,仔細(xì)讀一下Saks的文章吧儿奶。)如果應(yīng)試者能正確回答這個(gè)問(wèn)題椰弊,我將問(wèn)他一個(gè)附加的問(wèn)題:下面的聲明都是什么意思茬祷?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前兩個(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忘苛,也還是能很容易寫(xiě)出功能正確的程序绊汹,那么我為什么還要如此看重關(guān)鍵字const呢狐榔?我也如下的幾下理由:

1). 關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶(hù)這個(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)饵沧。

97.關(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ì)訪(fǎng)問(wèn)到的非自動(dòng)變量(Non-automatic variables)

3). 多線(xiàn)程應(yīng)用中被幾個(gè)任務(wù)共享的變量

回答不出這個(gè)問(wèn)題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問(wèn)題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道党远,所用這些都要求volatile變量腕柜。不懂得volatile內(nèi)容將會(huì)帶來(lái)災(zāi)難盏缤。

假設(shè)被面試者正確地回答了這是問(wèn)題(嗯砰蠢,懷疑這否會(huì)是這樣),我將稍微深究一下唉铜,看一下這家伙是不是直正懂得volatile完全的重要性。

1). 一個(gè)參數(shù)既可以是const還可以是volatile嗎潭流?解釋為什么竞惋。

2). 一個(gè)指針可以是volatile 嗎?解釋為什么灰嫉。

3). 下面的函數(shù)有什么錯(cuò)誤:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案:

1). 是的拆宛。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖兯先觥K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它浑厚。

2). 是的。盡管這并不很常見(jiàn)根盒。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)钳幅。

3). 這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr指向值的平方炎滞,但是贡这,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類(lèi)似下面的代碼:

int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地該變厂榛,因此a和b可能是不同的。結(jié)果丽惭,這段代碼可能返不是你所期望的平方值击奶!正確的代碼如下:

long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

98.下面的代碼輸出是什么,為什么责掏?

void foo(void)

{

unsigned int a = 6;

int b = -20;

(a+b > 6) puts("> 6") : puts("<= 6");

}

這個(gè)問(wèn)題測(cè)試你是否懂得C語(yǔ)言中的整數(shù)自動(dòng)轉(zhuǎn)換原則柜砾,我發(fā)現(xiàn)有些開(kāi)發(fā)者懂得極少這些東西。不管如何换衬,這無(wú)符號(hào)整型問(wèn)題的答案是輸出是“>6”痰驱。原因是當(dāng)表達(dá)式中存在有符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)類(lèi)型证芭。因此-20變成了一個(gè)非常大的正整數(shù),所以該表達(dá)式計(jì)算出的結(jié)果大于6担映。這一點(diǎn)對(duì)于應(yīng)當(dāng)頻繁用到無(wú)符號(hào)數(shù)據(jù)類(lèi)型的嵌入式系統(tǒng)來(lái)說(shuō)是豐常重要的废士。如果你答錯(cuò)了這個(gè)問(wèn)題,你也就到了得不到這份工作的邊緣蝇完。

99.C語(yǔ)言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎官硝,如果是它做些什么?

int a = 5, b = 7, c;

c = a+++b;

這個(gè)問(wèn)題將做為這個(gè)測(cè)驗(yàn)的一個(gè)愉快的結(jié)尾短蜕。不管你相不相信氢架,上面的例子是完全合乎語(yǔ)法的。問(wèn)題是編譯器如何處理它朋魔?水平不高的編譯作者實(shí)際上會(huì)爭(zhēng)論這個(gè)問(wèn)題岖研,根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法警检。因此孙援,上面的代碼被處理成:

c = a++ + b;

因此, 這段代碼持行后a = 6, b = 7, c = 12。

如果你知道答案解滓,或猜出正確答案赃磨,做得好。如果你不知道答案洼裤,我也不把這個(gè)當(dāng)作問(wèn)題邻辉。我發(fā)現(xiàn)這個(gè)問(wèn)題的最大好處是:這是一個(gè)關(guān)于代碼編寫(xiě)風(fēng)格,代碼的可讀性腮鞍,代碼的可修改性的好的話(huà)題

100.線(xiàn)形表a值骇、b為兩個(gè)有序升序的線(xiàn)形表,編寫(xiě)一程序移国,使兩個(gè)有序線(xiàn)形表合并成一個(gè)有序升序線(xiàn)形表

兩路歸并排序

Linklist *unio(Linklist *p,Linklist *q){

linklist *R,*pa,*qa,*ra;

pa=p;

qa=q;

R=ra=p;

while(pa->next!=NULL&&qa->next!=NULL){

if(pa->data>qa->data){

ra->next=qa;

qa=qa->next;

}

else{

ra->next=pa;

pa=pa->next;

}

}

if(pa->next!=NULL)

ra->next=pa;

if(qa->next!=NULL)

ra->next==qa;

return R;

}

101.用遞歸算法判斷數(shù)組a[N]是否為一個(gè)遞增數(shù)組吱瘩。

遞歸的方法,記錄當(dāng)前最大的迹缀,并且判斷當(dāng)前的是否比這個(gè)還大使碾,大則繼續(xù),否則返回false結(jié)束:

bool fun( int a[], int n )

{

if( n= =1 )

return true;

if( n= =2 )

return a[n-1] >= a[n-2];

return fun( a,n-1) && ( a[n-1] >= a[n-2] );

}

102.編寫(xiě)算法祝懂,從10億個(gè)浮點(diǎn)數(shù)當(dāng)中票摇,選出其中最大的10000個(gè)?

用外部排序,在《數(shù)據(jù)結(jié)構(gòu)》書(shū)上有?

《計(jì)算方法導(dǎo)論》在找到第n大的數(shù)的算法上加工 (注意:先將數(shù)據(jù)進(jìn)行分割成數(shù)據(jù)量小的一些文件砚蓬,如1000000個(gè)數(shù)據(jù)為一個(gè)文件矢门,然后將每個(gè)文件數(shù)據(jù)進(jìn)行排序,用快速排序法排序,然后使用K路合并法將其合并到一個(gè)文件下祟剔,取出排序好的最大的10000個(gè)數(shù)據(jù))

103.

1.給兩個(gè)數(shù)組和他們的大小隔躲,還有一動(dòng)態(tài)開(kāi)辟的內(nèi)存,求交集物延,把交集放到動(dòng)態(tài)內(nèi)存dongtai宣旱,并且返回交集個(gè)數(shù)

long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])

2.單連表的建立,把'a'--'z'26個(gè)字母插入到連表中教届,并且倒敘响鹃,還要打印案训!

109.什么是預(yù)編譯,何時(shí)需要預(yù)編譯?

預(yù)編譯又稱(chēng)為預(yù)處理买置,是做些代碼文本的替換工作,處理#開(kāi)頭的指令强霎,預(yù)編譯指令指示了程序正式編譯前就有編譯器進(jìn)行的操作忿项,可以放在程序中的任何位置

c提供的預(yù)處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯

總是使用不經(jīng)常改動(dòng)的大型代碼體

程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)城舞,在這種情況下轩触,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭

107.ASDL使用的是什么協(xié)議?并進(jìn)行簡(jiǎn)單描述家夺?

105.判斷字符串是否為回文

http://www.360doc.com/content/05/0717/12/256_2100.shtml

110.進(jìn)程和線(xiàn)程的區(qū)別

什么是進(jìn)程脱柱,普通的解釋進(jìn)程是程序的一次執(zhí)行,而什么是線(xiàn)程拉馋,線(xiàn)程可以理解為進(jìn)程中的執(zhí)行的一段程序片段

進(jìn)程是獨(dú)立的榨为,這表現(xiàn)在內(nèi)存空間,上下文環(huán)境煌茴,線(xiàn)程運(yùn)行在進(jìn)程空間內(nèi)随闺,一般來(lái)講,進(jìn)程是無(wú)法突破進(jìn)程邊界存取其他進(jìn)程內(nèi)的存儲(chǔ)空間蔓腐;而線(xiàn)程由于處于進(jìn)程空間內(nèi)矩乐,所以同一進(jìn)程所產(chǎn)生的線(xiàn)程共享同一內(nèi)存空間,統(tǒng)一進(jìn)程中的兩段代碼不能夠同時(shí)執(zhí)行回论,除非引入線(xiàn)程散罕,線(xiàn)程是屬于進(jìn)程的,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線(xiàn)程都會(huì)被強(qiáng)制退出并清除傀蓉,線(xiàn)程占用資源要少于少于進(jìn)程所占用的資源笨使,進(jìn)程和線(xiàn)程都可以有優(yōu)先級(jí),在線(xiàn)程系統(tǒng)中進(jìn)程也是一個(gè)線(xiàn)程僚害,可以將進(jìn)程理解為一個(gè)程序的第一個(gè)線(xiàn)程

線(xiàn)程與進(jìn)程的區(qū)別:

1)地址空間:進(jìn)程至少有一個(gè)線(xiàn)程,線(xiàn)程共享進(jìn)程的地址空間,而進(jìn)程有自己獨(dú)立的地址空間

2)進(jìn)程是資源分配和擁有的單位萨蚕,同一進(jìn)程內(nèi)的線(xiàn)程共享進(jìn)程的資源

3)線(xiàn)程是處理器調(diào)度的基本單位靶草,但進(jìn)程不是

4)兩者均可并發(fā)執(zhí)行

111.插入排序和選擇排序

插入排序基本思想:

(假定從大到小排序)依次從后面拿一個(gè)數(shù)和前面已經(jīng)排好序的數(shù)進(jìn)行比較,比較的過(guò)程是從已經(jīng)排好序的數(shù)中最后一個(gè)數(shù)開(kāi)始比較岳遥,如果比這個(gè)數(shù)奕翔,繼續(xù)往前面比較,直到找到比它大的數(shù)浩蓉,然后就放在它的后面派继,如果一直沒(méi)有找到,肯定這個(gè)數(shù)已經(jīng)比較到了第一個(gè)數(shù)捻艳,那就放到第一個(gè)數(shù)的前面驾窟。

選擇排序(Selection Sort)是一種簡(jiǎn)單直觀(guān)的排序算法。它的工作原理如下认轨。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小元素,然后放到排序序列末尾绅络。以此類(lèi)推,直到所有元素均排序完畢。

112.運(yùn)算符優(yōu)先級(jí)問(wèn)題

能正確表示a和b同時(shí)為正或同時(shí)為負(fù)的邏輯表達(dá)式是(D )嘁字。

A恩急、(a>=0||b>=0)&&(a<0||b<0)?

B、(a>=0&&b>=0)&&(a<0&&b<0)?

C纪蜒、(a+b>0)&&(a+b<=0)?

D衷恭、a*b>0

以下關(guān)于運(yùn)算符優(yōu)先順序的描述中正確的是(C)。?

A纯续、關(guān)系運(yùn)算符<算術(shù)運(yùn)算符<賦值運(yùn)算符<邏輯與運(yùn)算符?

B随珠、邏輯與運(yùn)算符<關(guān)系運(yùn)算符<算術(shù)運(yùn)算符<賦值運(yùn)算符?

C、賦值運(yùn)算符<邏輯與運(yùn)算符<關(guān)系運(yùn)算符<算術(shù)運(yùn)算符?

D杆烁、算術(shù)運(yùn)算符<關(guān)系運(yùn)算符<賦值運(yùn)算符<邏輯與運(yùn)算符

113.字符串倒序

方法一:使用 std::string 類(lèi)型

/* 將輸入的字符串反轉(zhuǎn)轰驳。

* 方法一:使用 string。

* By Ceeji

*/

#include <iostream>

#include <string>

using namespace std;

int main()

{

? ? ? ? ? ? ? string s, r; // 聲明字符串

? ? ? ? ? ? ? cin >> s; // 輸入字符串

? ? ? ? ? ? ? for (int i = 0; i < s.length (); i++)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r = s [i] + r;

? ? ? ? ? ? ? }

? ? ? ? ? ? ? cout << r; // 輸出字符串

? ? ? ? ? ? ? return 0;

}

方法二:使用 C風(fēng)格字符串 char *

/* 將輸入的字符串反轉(zhuǎn)座硕。

* 方法二:使用 char *闰挡。

* By Ceeji

*/

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

? ? ? ? ? ? ? // 輸入字符串。

? ? ? ? ? ? ? char s [300];

? ? ? ? ? ? ? scanf("%s",s);

? ? ? ? ? ? ? for (int i = 0; i < strlen(s); i++)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cout << *(s + strlen(s) - i - 1);

? ? ? ? ? ? ? }

? ? ? ? ? ? ? cout << endl;

? ? ? ? ? ? ? return 0;

}

方法三:使用 std::string 的另一種方法

/* 將輸入的字符串反轉(zhuǎn)析校。

* 方法三:使用 string 的另一個(gè)方法构罗。

* By Ceeji

*/

#include <iostream>

#include <string>

using namespace std;

int main()

{

? ? ? ? ? ? ? // 輸入字符串。

? ? ? ? ? ? ? string s;

? ? ? ? ? ? ? cin >> s;

? ? ? ? ? ? ? for (int i = 0; i < s.length(); i++)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cout << s[s.length() - i - 1];

? ? ? ? ? ? ? }

? ? ? ? ? ? ? cout << endl;

? ? ? ? ? ? ? return 0;

}

方法四:棧實(shí)現(xiàn)

#include <iostream.h>

struct sqstack

{

? ? ? ? char data;

? ? ? ? sqstack *top;

};

class stack

{

? ? ? ? sqstack *st;

public:

? ? ? ? void init()

? ? ? ? ? ? ? ? { st=NULL;}

? ? ? ? void push(char );

? ? ? ? char pop();

};

void stack::push(char k)

{

sqstack * newst=new sqstack;

? ? ? ? newst->data=k;

? ? ? ? newst->top=st;

? ? ? ? st=newst;

}

char stack::pop()

{

? ? ? ? char value;

? ? ? ? sqstack *t;

? ? ? ? value=st->data;

? ? ? ? t=st;

? ? ? ? st=st->top;

? ? ? ? delete t;

? ? ? ? return value;

}

void main()

{

? ? ? ? stack A;

? ? ? ? A.init();

? ? ? ? int n;

? ? ? ? cout<<"請(qǐng)輸入字符個(gè)數(shù)n:";

? ? ? ? cin>>n;

? ? ? ? char *arr=new char[n];

? ? ? ? cout<<"請(qǐng)輸入"<<n<<"個(gè)字符:"<<endl;

? ? ? ? for(int i=0;i<n;i++)

? ? ? ? ? ? ? ? ? cin>>arr[i];

? ? ? ? cout<<endl;

? ? ? ? cout<<"入棧順序: ";

? ? ? ? for(i=0;i<n;i++)

? ? ? ? {

cout<<arr[i]<<" ";

? ? ? ? A.push(arr[i]);

? }

? cout<<endl<<"Out:"<<endl;

? for(i=0;i<n;i++)

? ? ? ? cout<<A.pop()<<" ";

? cout<<endl;

? delete arr;

}

方法五:反向迭代器

int main()

{

string r, s;

cin >> s;

r.assign(s.rbegin(), s.rend());

cout << r << endl;

return true;

}

方法六:遞歸

void inverse(char *p)

{

if( *p = = '/0' )

return;

inverse( p+1 );

printf( "%c", *p );

}

數(shù)字反轉(zhuǎn)

#include<iostream>

using namespace std;

void main()

{ int n,r,num=0;

cout << "Enter the number: ";

cin >> n;

cout << "The number in reverse order is ";

do

{ r=n%10;

? ? cout << r;

n/=10;

}

while(n!=0);

cout << endl;

}

114.交換兩個(gè)數(shù)的宏定義

交換兩個(gè)參數(shù)值的宏定義為:. #define SWAP(a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b);

115.Itearator各指針的區(qū)別

游標(biāo)和指針

我說(shuō)過(guò)游標(biāo)是指針智玻,但不僅僅是指針遂唧。游標(biāo)和指針很像,功能很像指針吊奢,但是實(shí)際上盖彭,游標(biāo)是通過(guò)重載一元的”*”和”->”來(lái)從容器中間接地返回一個(gè)值。將這些值存儲(chǔ)在容器中并不是一個(gè)好主意,因?yàn)槊慨?dāng)一個(gè)新值添加到容器中或者有一個(gè)值從容器中刪除召边,這些值就會(huì)失效铺呵。在某種程度上,游標(biāo)可以看作是句柄(handle)隧熙。通常情況下游標(biāo)(iterator)的類(lèi)型可以有所變化片挂,這樣容器也會(huì)有幾種不同方式的轉(zhuǎn)變:

iterator——對(duì)于除了vector以外的其他任何容器,你可以通過(guò)這種游標(biāo)在一次操作中在容器中朝向前的方向走一步贞盯。這意味著對(duì)于這種游標(biāo)你只能使用“++”操作符音念。而不能使用“--”或“+=”操作符。而對(duì)于vector這一種容器躏敢,你可以使用“+=”闷愤、“—”、“++”父丰、“-=”中的任何一種操作符和“<”肝谭、“<=”、“>”蛾扇、“>=”攘烛、“==”、“!=”等比較運(yùn)算符镀首。

116. C++中的class和struct的區(qū)別

從語(yǔ)法上坟漱,在C++中(只討論C++中)。class和struct做類(lèi)型定義時(shí)只有兩點(diǎn)區(qū)別:

(一)默認(rèn)繼承權(quán)限更哄。如果不明確指定芋齿,來(lái)自class的繼承按照private繼承處理,來(lái)自struct的繼承按照public繼承處理成翩;

(二)成員的默認(rèn)訪(fǎng)問(wèn)權(quán)限觅捆。class的成員默認(rèn)是private權(quán)限,struct默認(rèn)是public權(quán)限麻敌。

最后栅炒,作為語(yǔ)言的兩個(gè)關(guān)鍵字,除去定義類(lèi)型時(shí)有上述區(qū)別之外术羔,另外還有一點(diǎn)點(diǎn):“class”這個(gè)關(guān)鍵字還用于定義模板參數(shù)赢赊,就像“typename”。但關(guān)鍵字“struct”不用于定義模板參數(shù)级历。

關(guān)于使用大括號(hào)初始化?

class和struct如果定義了構(gòu)造函數(shù)的話(huà)释移,都不能用大括號(hào)進(jìn)行初始化

如果沒(méi)有定義構(gòu)造函數(shù),struct可以用大括號(hào)初始化寥殖。

如果沒(méi)有定義構(gòu)造函數(shù)玩讳,且所有成員變量全是public的話(huà)涩蜘,可以用大括號(hào)初始化。

關(guān)于默認(rèn)訪(fǎng)問(wèn)權(quán)限

class中默認(rèn)的成員訪(fǎng)問(wèn)權(quán)限是private的熏纯,而struct中則是public的皱坛。

關(guān)于繼承方式

class繼承默認(rèn)是private繼承,而struct繼承默認(rèn)是public繼承豆巨。?

關(guān)于模版

在模版中,類(lèi)型參數(shù)前面可以使用class或typename掐场,如果使用struct往扔,則含義不同,struct后面跟的是“non-type template parameter”熊户,而class或typename后面跟的是類(lèi)型參數(shù)萍膛。

class中有個(gè)默認(rèn)的this指針,struct沒(méi)有

119.關(guān)系模型的基本概念

關(guān)系數(shù)據(jù)庫(kù)以關(guān)系模型為基礎(chǔ)嚷堡,它有以下三部分組成:

●數(shù)據(jù)結(jié)構(gòu)——模型所操作的對(duì)象蝗罗、類(lèi)型的集合

●完整性規(guī)則——保證數(shù)據(jù)有效、正確的約束條件

●數(shù)據(jù)操作——對(duì)模型對(duì)象所允許執(zhí)行的操作方式

關(guān)系(Relation)是一個(gè)由行和列組成的二維表格蝌戒,表中的每一行是一條記錄(Record)串塑,每一列是記錄的一個(gè)字段(Field)。表中的每一條記錄必須是互斥的北苟,字段的值必須具有原子性桩匪。

120.SQL語(yǔ)言概述

SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言)是關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的一種國(guó)際標(biāo)準(zhǔn),它是一種非過(guò)程化的語(yǔ)言友鼻。通過(guò)編寫(xiě)SQL傻昙,我們可以實(shí)現(xiàn)對(duì)關(guān)系數(shù)據(jù)庫(kù)的全部操作。

●數(shù)據(jù)定義語(yǔ)言(DDL)——建立和管理數(shù)據(jù)庫(kù)對(duì)象

●數(shù)據(jù)操縱語(yǔ)言(DML)——用來(lái)查詢(xún)與更新數(shù)據(jù)

●數(shù)據(jù)控制語(yǔ)言(DCL)——控制數(shù)據(jù)的安全性

事務(wù)處理系統(tǒng)的典型特點(diǎn)是具備ACID特征彩扔。ACID指的是Atomic(原子的)妆档、Consistent(一致的)、Isolated(隔離的)以及Durable(持續(xù)的)虫碉,它們代表著事務(wù)處理應(yīng)該具備的四個(gè)特征:

原子性:組成事務(wù)處理的語(yǔ)句形成了一個(gè)邏輯單元贾惦,不能只執(zhí)行其中的一部分

一致性:在事務(wù)處理執(zhí)行之前和之后,數(shù)據(jù)是一致的蔗衡。

隔離性:一個(gè)事務(wù)處理對(duì)另一個(gè)事務(wù)處理沒(méi)有影響纤虽。

持續(xù)性:當(dāng)事務(wù)處理成功執(zhí)行到結(jié)束的時(shí)候,其效果在數(shù)據(jù)庫(kù)中被永久紀(jì)錄下來(lái)绞惦。

121.C語(yǔ)言中結(jié)構(gòu)化程序設(shè)計(jì)的三種基本控制結(jié)構(gòu)

順序結(jié)構(gòu)逼纸、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)

122.CVS是什么济蝉?

cvs(Concurrent Version System) 是一個(gè)版本控制系統(tǒng)杰刽。使用它菠发,可以記錄下你的源文件的歷史

123.三種基本的數(shù)據(jù)模型

按照數(shù)據(jù)結(jié)構(gòu)類(lèi)型的不同,將數(shù)據(jù)模型劃分為層次模型贺嫂、網(wǎng)狀模型滓鸠、關(guān)系模型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市第喳,隨后出現(xiàn)的幾起案子糜俗,更是在濱河造成了極大的恐慌,老刑警劉巖曲饱,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠抹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扩淀,警方通過(guò)查閱死者的電腦和手機(jī)楔敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驻谆,“玉大人卵凑,你說(shuō)我怎么就攤上這事∈る” “怎么了勺卢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)区端。 經(jīng)常有香客問(wèn)我值漫,道長(zhǎng),這世上最難降的妖魔是什么织盼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任杨何,我火速辦了婚禮,結(jié)果婚禮上沥邻,老公的妹妹穿的比我還像新娘危虱。我一直安慰自己,他們只是感情好唐全,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布埃跷。 她就那樣靜靜地躺著,像睡著了一般邮利。 火紅的嫁衣襯著肌膚如雪弥雹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天延届,我揣著相機(jī)與錄音剪勿,去河邊找鬼。 笑死方庭,一個(gè)胖子當(dāng)著我的面吹牛厕吉,可吹牛的內(nèi)容都是我干的酱固。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼头朱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼运悲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起项钮,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤班眯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后烁巫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鳖敷,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年程拭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍潘。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恃鞋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亦歉,到底是詐尸還是另有隱情恤浪,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布肴楷,位于F島的核電站水由,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赛蔫。R本人自食惡果不足惜砂客,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呵恢。 院中可真熱鬧鞠值,春花似錦、人聲如沸渗钉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳄橘。三九已至声离,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘫怜,已是汗流浹背术徊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宝磨,地道東北人弧关。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓盅安,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親世囊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子别瞭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 幾種語(yǔ)言的特性 匯編程序:將匯編語(yǔ)言源程序翻譯成目標(biāo)程序編譯程序:將高級(jí)語(yǔ)言源程序翻譯成目標(biāo)程序解釋程序:將高級(jí)語(yǔ)...
    囊螢映雪的螢閱讀 2,867評(píng)論 1 5
  • 題目類(lèi)型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別蝙寨? C沒(méi)有Protection行為...
    阿面a閱讀 7,635評(píng)論 0 10
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,689評(píng)論 0 73
  • 1.寫(xiě)一個(gè)NSString類(lèi)的實(shí)現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,747評(píng)論 2 37
  • 暗戀。這個(gè)詞聽(tīng)著就讓人覺(jué)得是一件讓人敬佩的事情嗤瞎。因?yàn)榘祽僖粋€(gè)人墙歪,是一件很難的事情。雖然有的時(shí)候也會(huì)覺(jué)得贝奇,暗戀虹菲,其實(shí)...
    賢子xz閱讀 148評(píng)論 1 1