解答題:
1. 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的?
#ifdef__cplusplus
cout<<“c++";
#else
cout<<"c";
#endif
2. c與c++的不同:
從機(jī)制上看: c面向過(guò)程;c++面向?qū)ο,提供?用c++編寫(xiě)面向?qū)ο蟮某绦虮萩容易;
從適用方向上看:c適用于要求代碼體積小,效率高的場(chǎng)合,如嵌入式(linux 核心用c寫(xiě),它要求執(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)繼承(指使用基類的屬性和方法而無(wú)需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(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)存地址;
@引用沒(méi)有定義,在聲明時(shí)必須進(jìn)行初始化,引用不占內(nèi)存空間(沒(méi)有引用的指針,也沒(méi)有引用的引用);
引用一旦建立并初始化,就不再與其他變量關(guān)聯(lián);
@不存在指向空值的引用,存在指向NULL的指針;
什么是引用:
引用時(shí)變量的別名,對(duì)其應(yīng)用的操作與對(duì)變量直接進(jìn)行操作效果完全相同;
將引用作為函數(shù)參數(shù)有什么特點(diǎn)?
(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。被調(diào)函數(shù)的形參就成為原來(lái)主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋(gè)別名來(lái)使用,所以在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。
(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒(mé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分配)就無(wú)法釋放,造成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ì)象,也就是說(shuō),連續(xù)的兩個(gè)<<操作符實(shí)際上是針對(duì)不同對(duì)象的!這無(wú)法讓人接受。對(duì)于返回一個(gè)流指針則不能連續(xù)使用<<操作符。因此,返回一個(gè)流對(duì)象引用是惟一選擇。賦值操作符=。這個(gè)操作符象流操作符一樣,是可以連續(xù)使用的,例如:x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是一個(gè)左值,以便可以被繼續(xù)賦值。因此引用成了這個(gè)操作符的惟一返回值選擇。
6 )在另外的一些操作符中,卻千萬(wàn)不能返回引用:+-*/ 四則運(yùn)算符。主要原因是這四個(gè)操作符沒(méi)有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ù)訪問(wèn);
Public成員:可以被任何函數(shù)訪問(wèn);
Protected成員:只能被類的成員函數(shù),友元,子類的成員函數(shù)與友元訪問(wèn);
本文已影響
6827
人