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