c++經(jīng)典筆試題和面試題答案(一)

思而思學(xué)網(wǎng)
解答題: 1. 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的? #ifdef__cplusplus cout<<“c++"; #else cout<<"c"; #endif 2. c與c++的不同: 從機(jī)制上看: c面向過程;c++面向?qū)ο,提供?用c++編寫面向?qū)ο蟮某绦虮萩容易; 從適用方向上看:c適用于要求代碼體積小,效率高的場(chǎng)合,如嵌入式(linux 核心用c寫,它要求執(zhí)行效率極高); C++適合上層復(fù)雜應(yīng)用; 3. 面向?qū)ο蟮娜齻(gè)基本特征,并簡(jiǎn)單敘述之? 答: 1. 封裝:將客觀事物抽象成類,每個(gè)類對(duì)數(shù)據(jù)和方法進(jìn)行保護(hù)(public,protected,private) 2. 繼承:廣義的繼承有三種實(shí)現(xiàn)形式: 實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。前兩種(類繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。 3. 多態(tài):允許將子類類型的指針賦值給父類類型的指針。 4. 多態(tài)的作用(基類指針,虛函數(shù)): 1. 隱藏實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)代碼模塊化;擴(kuò)展代碼模塊化,實(shí)現(xiàn)代碼重用; 2. 接口重用; 5. 類中的static成員不能被繼承;為類的所有對(duì)象共享; 6. “引用”與“指針”的區(qū)別: @指針是一個(gè)變量;可以重復(fù)賦值將其指向其他內(nèi)存地址; @引用沒有定義,在聲明時(shí)必須進(jìn)行初始化,引用不占內(nèi)存空間(沒有引用的指針,也沒有引用的引用); 引用一旦建立并初始化,就不再與其他變量關(guān)聯(lián); @不存在指向空值的引用,存在指向NULL的指針; 什么是引用: 引用時(shí)變量的別名,對(duì)其應(yīng)用的操作與對(duì)變量直接進(jìn)行操作效果完全相同; 將引用作為函數(shù)參數(shù)有什么特點(diǎn)? (1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋(gè)別名來使用,所以在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。 (2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,它是直接對(duì)實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給形參分配存儲(chǔ)單元,形參變量是實(shí)參變量的副本;如果傳遞的是對(duì)象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。 (3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲(chǔ)單元,對(duì)指針?biāo)赶虻淖兞窟M(jìn)行間接操作,需要重復(fù)使用"指針變量名"的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。而引用更容易使用,更清晰。 除流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用 c++中將引用作為函數(shù)返回類型: 1)使用引用作為函數(shù)的參數(shù)和返回值,效率更高;(在內(nèi)存中不產(chǎn)生被返回值的副本) 2)返回變量,對(duì)象的引用,該變量,對(duì)象應(yīng)該在函數(shù)執(zhí)行前就存在,不能返回函數(shù)中的局部變量的引用; 3 ) 不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用, 這個(gè)引用所指向的空間(由new分配)就無法釋放,造成memory leak.; 4 ) 可以返回類成員的引用,但最好是const。主要原因是當(dāng)對(duì)象的屬性是與某種業(yè)務(wù)規(guī)則(business rule)相關(guān)聯(lián)的時(shí)候,其賦值常常與某些其它屬性或者對(duì)象的狀態(tài)有關(guān),因此有必要將賦值操作封裝在一個(gè)業(yè)務(wù)規(guī)則當(dāng)中。如果其它對(duì)象可以獲得該屬性的非常量引用(或指針),那么對(duì)該屬性的單純賦值就會(huì)破壞業(yè)務(wù)規(guī)則的完整性。 5 ) 流操作符重載返回值申明為“引用”的作用: 流操作符<<和>>,這兩個(gè)操作符常常希望被連續(xù)使用,例如:cout <<"hello" << endl; 因此這兩個(gè)操作符的返回值應(yīng)該是一個(gè)仍然支持這兩個(gè)操作符的流引用?蛇x的其它方案包括:返回一個(gè)流對(duì)象和返回一個(gè)流對(duì)象指針。但是對(duì)于返回一個(gè)流對(duì)象,程序必須重新(拷貝)構(gòu)造一個(gè)新的流對(duì)象,也就是說,連續(xù)的兩個(gè)<<操作符實(shí)際上是針對(duì)不同對(duì)象的!這無法讓人接受。對(duì)于返回一個(gè)流指針則不能連續(xù)使用<<操作符。因此,返回一個(gè)流對(duì)象引用是惟一選擇。賦值操作符=。這個(gè)操作符象流操作符一樣,是可以連續(xù)使用的,例如:x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是一個(gè)左值,以便可以被繼續(xù)賦值。因此引用成了這個(gè)操作符的惟一返回值選擇。 6 )在另外的一些操作符中,卻千萬不能返回引用:+-/ 四則運(yùn)算符。主要原因是這四個(gè)操作符沒有side effect,因此,它們必須構(gòu)造一個(gè)對(duì)象作為返回值,可選的方案包括:返回一個(gè)對(duì)象、返回一個(gè)局部變量的引用,返回一個(gè)new分配的對(duì)象的引用、返回一個(gè)靜態(tài)對(duì)象引用。根據(jù)前面提到的引用作為返回值的三個(gè)規(guī)則,第2、3兩個(gè)方案都被否決了。靜態(tài)對(duì)象的引用又因?yàn)?(a+b) == (c+d))會(huì)永遠(yuǎn)為true而導(dǎo)致錯(cuò)誤。所以可選的只剩下返回一個(gè)對(duì)象了。 引用與多態(tài)的關(guān)系: 引用是除指針外另一個(gè)可以產(chǎn)生多態(tài)效果的手段。一個(gè)基類的引用可以指向它的派生類實(shí)例。 Class A; Class B : Class A{...}; B b; A& ref = b; 7. c++中private, public, protected 的區(qū)別: 答: Private成員:只能被類的成員函數(shù)或者友元函數(shù)訪問; Public成員:可以被任何函數(shù)訪問; Protected成員:只能被類的成員函數(shù),友元,子類的成員函數(shù)與友元訪問;

熱門推薦

最新文章