2021 C++簡答題及其答案(非原創(chuàng))


收集非原創(chuàng)文章惑朦,如遇原作者兽泄,請私聊我,我會表明出處漾月!


1--10

1. C++中什么數(shù)據(jù)分配在棽∩遥或堆,靜態(tài)存儲區(qū)以及常量存儲區(qū)中梁肿?
棧蜓陌,里面的變量通常是局部變量、函數(shù)參數(shù)等吩蔑。
堆钮热,就是那些由 new 分配的內(nèi)存塊
全局/靜態(tài)存儲區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中
常量存儲區(qū)烛芬,這是一塊比較特殊的存儲區(qū)隧期,他們里面存放的是常量飒责,不允許修改
2. C++編譯器自動為類產(chǎn)生的四個缺省函數(shù)是什么?
默認構(gòu)造函數(shù)厌秒、析構(gòu)函數(shù)读拆、拷貝構(gòu)造函數(shù)、賦值函數(shù)
3. 我們可以用static修飾一個類的成員函數(shù)鸵闪,也可以用const修飾類的而成員函數(shù)請問:能不能同時用const和static修飾類的成員函數(shù)? 并進行說明.
不可以檐晕。C++編譯器在實現(xiàn)const的成員函數(shù)的時候為了確保該函數(shù)不能修改類的實例的狀態(tài),會在函數(shù)中添加一個隱式的參數(shù)const this*蚌讼。但當一個成員為static的時候辟灰,該函數(shù)是沒有this指針的。也就是說此時const的用法和static是沖突的篡石。

4. 在C++中芥喇,構(gòu)造函數(shù)是沒有返回值的,那么該如何處理構(gòu)造函數(shù)中可能發(fā)生的錯誤(例如資源分配失敾巳)继控?
Try catch 拋出異常,或者assert

5. 請簡述C/C++語言中椗志欤空間和堆空間的主要區(qū)別.

  • 1申請方式
    stack: 由系統(tǒng)自動分配武通。 例如,聲明在函數(shù)中一個局部變量 int b; 系統(tǒng)自動在棧中為b開辟空間
    heap: 需要程序員自己申請珊搀,并指明大小冶忱,在c中malloc函數(shù) ,在C++中用new運算符
  • 2 申請后系統(tǒng)的響應(yīng)
    棧:只要棧的剩余空間大于所申請空間境析,系統(tǒng)將為程序提供內(nèi)存囚枪,否則將報異常提示棧溢出。
    堆:首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表劳淆,當系統(tǒng)收到程序的申請時链沼,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結(jié)點憔儿,然后將該結(jié)點從空閑結(jié)點鏈表中刪除忆植,并將該結(jié)點的空間分配給程序,另外谒臼,對于大多數(shù)系統(tǒng)朝刊,會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣蜈缤,代碼中的delete語句才能正確的釋放本內(nèi)存空間拾氓。另外,由于找到的堆結(jié)點的大小不一定正好等于申請的大小底哥,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中咙鞍。
  • 3申請大小的限制
    棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu)房官,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的续滋,在WINDOWS下翰守,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù))疲酌,如果申請的空間超過棧的剩余空間時蜡峰,將提示overflow。因此朗恳,能從棧獲得的空間較小湿颅。
    堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域粥诫。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的油航,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址怀浆。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存谊囚。由此可見,堆獲得的空間比較靈活执赡,也比較大秒啦。
  • 4申請效率的比較:
    棧由系統(tǒng)自動分配,速度較快搀玖。但程序員是無法控制的。
    堆是由new分配的內(nèi)存驻呐,一般速度比較慢灌诅,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.
  • 5堆和棧中的存儲內(nèi)容
    棧: 在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址含末,然后是函數(shù)的各個參數(shù)猜拾,在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的佣盒,然后是函數(shù)中的局部變量挎袜。注意靜態(tài)變量是不入棧的。 當本次函數(shù)調(diào)用結(jié)束后肥惭,局部變量先出棧盯仪,然后是參數(shù),最后棧頂指針指向最開始存的地址蜜葱,也就是主函數(shù)中的下一條指令全景,程序由該點繼續(xù)運行。
    堆:一般是在堆的頭部用一個字節(jié)存放堆的大小牵囤。堆中的具體內(nèi)容有程序員安排爸黄。
  • 6存取效率的比較
    char s1[] = "aaaaaaaaaaaaaaa";
    char *s2 = "bbbbbbbbbbbbbbbbb";
    aaaaaaaaaaa是在運行時刻賦值的滞伟;
    而bbbbbbbbbbb是在編譯時就確定的;

6. C++處理一場可以有兩種方式炕贵,一種是throw異常梆奈,一種是在函數(shù)中return 錯誤碼.你怎么理解這兩種方法的優(yōu)劣.
請點擊!
7. 為什么析構(gòu)函數(shù)建議加virtual屬性
如果delete一個基類的指針時, 如果它指向的是一個子類的對象称开,那么析構(gòu)函數(shù)不為虛就會導致無法調(diào)用子類析構(gòu)函數(shù)亩钟,從而導致資源泄露。
8. 拷貝構(gòu)造函數(shù)的形參形式是什么樣子的钥弯?為什么采用這種形式径荔?什么情況下會被調(diào)用?

  • 1引用比較高效:如果形參是對象類型的脆霎,那么它是否也要實例化总处? 而且整個對象進行拷貝,效率不高睛蛛,很不劃算鹦马。如果形參是指針類型的,從編譯的角度來看:程序在編譯時分別將指針和引用添加到符號表上忆肾,符號表上記錄的是變量名及變量所對應(yīng)地址荸频。指針變量在符號表上對應(yīng)的地址值為指針變量的地址值,而引用在符號表上對應(yīng)的地址值為引用對象的地址值客冈。
  • 2.形參為對象類型是行不通的:
    復制構(gòu)造函數(shù)也是構(gòu)造函數(shù)旭从,只不過它比較特別而已。如果形參是對象场仲,在被調(diào)用時形參也需要實例化(構(gòu)造)那么它的構(gòu)造是不是也有點類似于和悦, 形參 = 實參 ;這么說來渠缕,這不是在調(diào)用復制構(gòu)造函數(shù)麼鸽素? 之后調(diào)用復制構(gòu)造函數(shù)的形參又要實例化,又調(diào)用復制構(gòu)造函數(shù)亦鳞,造成死循環(huán)
    通常構(gòu)造函數(shù)只在對象創(chuàng)建時被調(diào)用馍忽,而拷貝構(gòu)造函數(shù)則在以下3種情況下被調(diào)用。
    1燕差。當使用類的一個對象去初始化該類的另一個新對象時遭笋。
    2。如果函數(shù)的形參是類的對象谁不,那么當調(diào)用該函數(shù)時拷貝構(gòu)造函數(shù)也會被調(diào)用坐梯。
    3。如果函數(shù)的返回值是類的對象刹帕,那么函數(shù)執(zhí)行完成返回調(diào)用者時吵血。

9. 在C++的語法中有友元函數(shù)friend(一個類的成員函數(shù)可以作為另一個類的友元谎替,前者可以訪問后者對象的私有成員)。但后期的高級語言java和C#卻沒有這方面的語法支持蹋辅,為什么要去掉友元函數(shù)钱贯,談?wù)勀愕睦斫狻?/strong>
友元函數(shù)會破壞封裝和隱藏性質(zhì)
10. 簡單說明面向?qū)ο蟮奶匦约爸匾浴#~外擴展面向?qū)ο蟮奈宕蠡驹瓌t)
三大特性是:封裝,繼承,多態(tài)
封裝侦另,就是把客觀事物封裝成抽象的類秩命,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏褒傅。封裝是面向?qū)ο蟮奶卣髦黄瘢菍ο蠛皖惛拍畹闹饕匦浴?簡單的說,一個類就是一個封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實體殿托。在一個對象內(nèi)部霹菊,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問支竹。通過這種方式旋廷,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護,以防止程序中無關(guān)的部分意外的改變或錯誤的使用了對象的私有部分礼搁。
繼承是指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法饶碘。它支持按級分類的概念。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能馒吴,并在無需重新編寫原來的類的情況下對這些功能進行擴展扎运。 通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”饮戳、“父類”或“超類”绪囱。繼承的過程,就是從一般到特殊的過程莹捡。要實現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現(xiàn)扣甲。繼承概念的實現(xiàn)方式有二類:實現(xiàn)繼承與接口繼承篮赢。實現(xiàn)繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱琉挖、但是子類必須提供實現(xiàn)的能力启泣;
多態(tài)是指一個類實例的相同方法在不同情形有不同表現(xiàn)形式。多態(tài)機制使具有不同內(nèi)部結(jié)構(gòu)的對象可以共享相同的外部接口示辈。這意味著寥茫,雖然針對不同對象的具體操作不同,但通過一個公共的類矾麻,它們(那些操作)可以通過相同的方式予以調(diào)用纱耻。
**五大基本原則 **
單一職責原則SRP(Single Responsibility Principle)
是指一個類的功能要單一芭梯,不能包羅萬象。
開放封閉原則OCP(Open-Close Principle)
一個模塊在擴展性方面應(yīng)該是開放的而在更改性方面應(yīng)該是封閉的弄喘。
替換原則(the Liskov Substitution Principle LSP)
子類應(yīng)當可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方玖喘。
依賴原則(the Dependency Inversion Principle DIP) 具體依賴抽象,上層依賴下層蘑志。接口分離原則(the Interface Segregation Principle ISP)
模塊間要通過抽象接口隔離開累奈,而不是通過具體的類強耦合起來

11--20

11. 指針和引用的區(qū)別是什么
1.指針和引用的定義和性質(zhì)區(qū)別:
(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址急但,指向內(nèi)存的一個存儲單元澎媒;而引用跟原來的變量實質(zhì)上是同一個東西,只不過是原變量的一個別名而已波桩。
(2)可以有const指針戒努,但是沒有const引用;
(3)指針可以有多級突委,但是引用只能是一級(int ??p柏卤;合法 而 int &&a是不合法的)
(4)指針的值可以為空,但是引用的值不能為NULL匀油,并且引用在定義的時候必須初始化缘缚。
(5)指針的值在初始化后可以改變,即指向其它的存儲單元敌蚜,而引用在進行初始化后就不會再改變了桥滨。
(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大谐诔怠齐媒;
(7)指針和引用的自增(++)運算意義不一樣;
2.指針和引用作為函數(shù)參數(shù)進行傳遞時的區(qū)別纷跛。
(1)指針作為參數(shù)進行傳遞:
一級指針傳遞不會修改實參指針的值喻括。
3.將引用作為函數(shù)的參數(shù)進行傳遞。
在講引用作為函數(shù)參數(shù)進行傳遞時贫奠,實質(zhì)上傳遞的是實參本身唬血,即傳遞進來的不是實參的一個拷貝,因此對形參的修改其實是對實參的修改唤崭,所以在用引用進行參數(shù)傳遞時拷恨,不僅節(jié)約時間,而且可以節(jié)約空間谢肾。
(2)malloc/free & new/delete的區(qū)別是什么
malloc/free:
函數(shù)原型及說明:
void *malloc(long NumBytes):該函數(shù)分配了NumBytes個字節(jié)腕侄,并返回了指向這塊內(nèi)存的指針。如果分配失敗,則返回一個空指針(NULL)冕杠。
void free(void *FirstByte): 該函數(shù)是將之前用malloc分配的空間還給程序或者是操作系統(tǒng)微姊,也就是釋放了這塊內(nèi)存,讓它重新得到自由拌汇。
4.內(nèi)存操作:
malloc函數(shù)的參數(shù)是接受需要分配的內(nèi)存字節(jié)數(shù)柒桑,如果內(nèi)存能夠滿足請求量,那么將會返回:指向被分配的內(nèi)存塊起始位置
free函數(shù)釋放的是指針指向的內(nèi)存(不是釋放的指針本身噪舀,不會刪除指針本身),其中指針必須指向所釋放內(nèi)存空間的首地址
new/free:
操作時發(fā)生事件:
new的時候會有兩個事件發(fā)生:1).內(nèi)存被分配(通過operator new 函數(shù)) 2).為被分配的內(nèi)存調(diào)用一個或多個構(gòu)造函數(shù)構(gòu)建對象
delete的時候魁淳,也有兩件事發(fā)生:1).為將被釋放的內(nèi)存調(diào)用一個或多個析構(gòu)函數(shù) 2).釋放內(nèi)存(通過operator delete 函數(shù))
特殊應(yīng)用:
使用delete是未加括號,delete便假設(shè)刪除對象是單一對象与倡。否則便假設(shè)刪除對象是個數(shù)組界逛。因此,如果在調(diào)用new時使用了[]纺座,則在調(diào)用delete時也使用[]息拜,如果你在調(diào)用new的時候沒有[],那么也不應(yīng)該在調(diào)用時使用[]净响。
malloc/free 和new/delete 的本質(zhì)區(qū)別:
1.malloc/free是C/C++語言的標準庫函數(shù)少欺,new/delete是C++的運算符
2.new能夠自動分配空間大小
3.對于用戶自定義的對象而言,用maloc/free無法滿足動態(tài)管理對象的要求馋贤。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù)赞别,對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符配乓,不在編譯器控制權(quán)限之內(nèi)仿滔,不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強加于malloc/free。因此C++需要一個能對對象完成動態(tài)內(nèi)存分配和初始化工作的運算符new犹芹,以及一個能對對象完成清理與釋放內(nèi)存工作的運算符delete---簡而言之 new/delete能進行對對象進行構(gòu)造和析構(gòu)函數(shù)的調(diào)用進而對內(nèi)存進行更加詳細的工作崎页,而malloc/free不能。
三腰埂、聯(lián)系
既然new/delete的功能完全覆蓋了malloc/free飒焦,為什么C++還保留malloc/free呢?因為C++程序經(jīng)常要調(diào)用C函數(shù)屿笼,而C程序只能用malloc/free管理動態(tài)內(nèi)存荒给。如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導致程序出錯刁卜。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,理論上講程序不會出錯曙咽,但是該程序的可讀性很差蛔趴。所以new/delete,malloc/free必須配對使用例朱。
(3)struct 與 class 的區(qū)別是什么
默認訪問屬性不同
12. 虛函數(shù)的理解
(1)C++中虛函數(shù)的實現(xiàn)機制
基類的虛函數(shù)表的創(chuàng)建:首先在基類聲明中找到所有的虛函數(shù)孝情,按照其聲明順序鱼蝉,編碼0,1,2,3,4……,然后按照此聲明順序為基類創(chuàng)建一個虛函數(shù)表箫荡,其內(nèi)容就是指向這些虛函數(shù)的函數(shù)指針魁亦,按照虛函數(shù)聲明的順序?qū)⑦@些虛函數(shù)的地址填入虛函數(shù)表中。
對于子類的虛函數(shù)表:首先將基類的虛函數(shù)表復制到該子類的虛函數(shù)表中羔挡。若子類重寫了基類的虛函數(shù)洁奈,則將子類的虛函數(shù)表中存放的函數(shù)地址(未重寫前存放的是子類的虛函數(shù)的函數(shù)地址)更新為重寫后函數(shù)的函數(shù)指針。若子類增加了一些虛函數(shù)的聲明绞灼,則將這些虛函數(shù)的地址加到該類虛函數(shù)表的后面利术。
當調(diào)用pBase->show();時,執(zhí)行的步驟:
1判斷Base類中show是否為虛函數(shù)低矮。
2若不是虛函數(shù)則找到pBase所指向的對象所屬類Base印叁。執(zhí)行Base::show()。若是虛函數(shù)則執(zhí)行步驟3.
3訪問pBase所指對象的虛函數(shù)表指針得到pBase所指對象所在類的虛函數(shù)表军掂。
4 查找Base中show()在聲明時的位序為x轮蜕,到步驟3得到的虛函數(shù)表中找到位序x,從而得到要執(zhí)行的show的函數(shù)地址蝗锥。
5根據(jù)函數(shù)地址和Base中聲明的show的函數(shù)類型(形參和返回值)訪問地址所指向的函數(shù)跃洛。
(2)對一個包含虛函數(shù)成員的對象bzero()會有什么問題

13.請簡單描述數(shù)組(vector)與鏈表(list)的區(qū)別以及應(yīng)用場景。
vector擁有一段連續(xù)的內(nèi)存空間韩玩,并且起始地址不變叮贩,因此 它能非常好的支持隨即存取,即[]操作符彪蓬,但由于它的內(nèi)存空間是連續(xù)的档冬,所以在中間進行插入和刪除會造成內(nèi)存塊的拷貝披坏,另外玫氢,當該數(shù)組后的內(nèi)存空間不夠時,需要重新申請一塊足夠大的內(nèi)存并進行內(nèi)存的拷貝琐旁。這些都大大影響了vector的效率牺陶。

List就是數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表(根據(jù)sgi stl源代碼)狮鸭,因此它的內(nèi)存空間可以是不連續(xù) 的惯退,通過指針來進行數(shù)據(jù)的訪問锁蠕,這個特點使得它的隨即存取變的非常沒有效率骑丸,因此它沒有提供[]操作符的重載。但由于鏈表的特點忍燥,它可以以很好的效率支持任意地方的刪除和插入拧晕。

因此在實際使用時,如何選擇哪一個梅垄,應(yīng)根據(jù)你的需要而定厂捞,一般應(yīng)遵循下面 的原則:
1、如果你需要高效的隨即存取队丝,而不在乎插入和刪除的效率靡馁,使用vector
2、如果你需要大量的插入和刪除机久,而不關(guān)心隨即存取臭墨,則應(yīng)使用list
14.C++語言中的函數(shù)參數(shù)傳遞方式有哪幾種?從功能膘盖,效率胧弛,安全,靈活性等方面比較一下侠畔。
按值傳遞(pass by value):首先計算出實參表達式的值结缚,接著給對應(yīng)的形參變量分配一個存儲空間,該空間的大小等于該形參類型的践图,然后把以求出的實參表達式的值一一存入到形參變量分配的存儲空間中掺冠,成為形參變量的初值,供被調(diào)用函數(shù)執(zhí)行時使用码党。這種傳遞是把實參表達式的值傳送給對應(yīng)的形參變量德崭,故稱這種傳遞方式為“按值傳遞”。使用這種方式揖盘,調(diào)用函數(shù)本省不對實參進行操作眉厨,也就是說,即使形參的值在函數(shù)中發(fā)生了變化兽狭,實參的值也完全不會受到影響憾股,仍為調(diào)用前的值鹿蜀。
地址傳遞(pass by pointer):如果在函數(shù)定義時將形參說明成指針,對這樣的函數(shù)進行調(diào)用時就需要指定地址值形式的實參服球。這時的參數(shù)傳遞方式就是地址傳遞方式茴恰。
引用傳遞(pass by reference):地址傳遞與按值傳遞的不同在于,它把實參的存儲地址傳送給對應(yīng)的形參斩熊,從而使得形參指針和實參指針指向同一個地址往枣。因此,被調(diào)用函數(shù)中對形參指針所指向的地址中內(nèi)容的任何改變都會影響到實參粉渠。
按值傳遞方式容易理解分冈,但形參值的改變不能對實參產(chǎn)生影響。
地址傳遞方式雖然可以使得形參的改變對相應(yīng)的實參有效霸株,但如果在函數(shù)中反復利用指針進行間接訪問雕沉,會使程序容易產(chǎn)生錯誤且難以閱讀。
如果以引用為參數(shù)去件,則既可以使得對形參的任何操作都能改變相應(yīng)的數(shù)據(jù)坡椒,又使得函數(shù)調(diào)用顯得方便、自然箫攀。引用傳遞方式是在函數(shù)定義時在形參前面加上引用運算符“&”旧困。
15.描述觀察者模式及其實現(xiàn)過程拍嵌,并舉例說明你是怎么使用觀察者模式的
請點擊傳送地址石洗!

16羞延、static 局部變量和普通局部變量有什么區(qū)別?
生命周期不同梢睛,static局部變量只被初始化一次肥印,下一次依據(jù)上一次結(jié)果值;
17绝葡、友元函數(shù)與成員函數(shù)的區(qū)別是什么深碱?
成員函數(shù)是類定義的一部分,通過特定的對象來調(diào)用藏畅。成員函數(shù)可以隱式訪問調(diào)用對象的成員敷硅,而無須使用成員操作符。友元函數(shù)不是類的組成部分愉阎,因此被稱為直接函數(shù)調(diào)用绞蹦。友元函數(shù)不能隱式訪問類成員,而必須將成員操作符用于作為參數(shù)傳遞的對象榜旦。友元函數(shù)不能被繼承幽七。
18、在C++程序中調(diào)用被C編譯器編譯后的函數(shù)溅呢,為什么要加extern c ?
以C的規(guī)則編譯C++代碼
19.面向?qū)ο蟮娜齻€基本特征澡屡,請簡單描述猿挚。
描述過,在上面
20.簡述面向?qū)ο蠹懊嫦蜻^程的定義并回答為何要在軟件工程中采用面向?qū)ο蟮乃枷搿?/strong>
面向?qū)ο笫前褬?gòu)成問題的事務(wù)分解成各個對象驶鹉,而建立對象的目的也不是為了完成一個個步驟绩蜻,而是為了描述某個事物在解決整個問題的過程中所發(fā)生的行為。
面向過程是分析解決問題的步驟室埋,然后用函數(shù)把這些步驟一步一步的實現(xiàn)辜羊,然后在使用的時候一一調(diào)用則可。
面向?qū)ο蟊WC了功能的統(tǒng)一型词顾,從而為擴展打下基礎(chǔ)。

21--30

21. 請簡述深拷貝和淺拷貝的定義碱妆。
深拷貝:如果一個類擁有資源肉盹,當這個類的對象發(fā)生復制過程的時候,資源重新分配疹尾,這個過程就是深拷貝上忍,反之,沒有重新分配資源纳本,就是淺拷貝窍蓝。
22. 請簡述static, const, inline 的定義及用法。
請點擊傳送門繁成!
23. 簡述多態(tài)作用及應(yīng)用方式吓笙?
多態(tài):同一操作作用于不同的對象,可以有不同的解釋巾腕,產(chǎn)生不同的執(zhí)行結(jié)果面睛。在運行時,可以通過指向基類的指針尊搬,來調(diào)用實現(xiàn)派生類中的方法叁鉴。C++中,實現(xiàn)多態(tài)有以下方法:虛函數(shù)佛寿,抽象類幌墓,覆蓋,模板(重載和多態(tài)無關(guān))冀泻。C++中的多態(tài)性具體體現(xiàn)在運行和編譯兩個方面常侣。運行時多態(tài)是動態(tài)多態(tài),其具體引用的對象在運行時才能確定腔长。編譯時多態(tài)是靜態(tài)多態(tài)袭祟,在編譯時就可以確定對象使用的形式。
24. 為什么類的靜態(tài)成員函數(shù)不能直接訪問類得非靜態(tài)成員變量捞附?
沒有this指針
25. c++中巾乳,什么函數(shù)不能聲明為虛函數(shù)您没?為什么?
普通函數(shù)
普通函數(shù)(非成員函數(shù))只能被overload胆绊,不能被override氨鹏,聲明為虛函數(shù)也沒有什么意思,因此編譯器會在編譯時邦定函數(shù)压状。多態(tài)的運行期行為體現(xiàn)在虛函數(shù)上仆抵,虛函數(shù)通過繼承方式來體現(xiàn)出多態(tài)作用,頂層函數(shù)不屬于成員函數(shù)种冬,是不能被繼承的
構(gòu)造函數(shù)
因為構(gòu)造函數(shù)本來就是為了明確初始化對象成員才產(chǎn)生的镣丑,然而virtual function主要是為了再不完全了解細節(jié)的情況下也能正確處理對象。另外娱两,virtual函數(shù)是在不同類型的對象產(chǎn)生不同的動作莺匠,現(xiàn)在對象還沒有產(chǎn)生,如何使用virtual函數(shù)來完成你想完成的動作十兢。
(1)構(gòu)造函數(shù)不能被繼承趣竣,因而不能聲明為virtual函數(shù)
(2)構(gòu)造函數(shù)一般是用來初始化對象,只有在一個對象生成之后旱物,才能發(fā)揮多態(tài)
作用遥缕,如果將構(gòu)造函數(shù)聲明為virtual函數(shù),則表現(xiàn)為在對象還沒有生成的情況下就使用了多態(tài)機制宵呛,因而是行不通的单匣。
內(nèi)聯(lián)成員函數(shù)
內(nèi)聯(lián)函數(shù)就是為了在代碼中直接展開,減少函數(shù)調(diào)用花費的代價宝穗,虛函數(shù)是為了在繼承后對象能夠準確的執(zhí)行自己的動作封孙,這是不可能統(tǒng)一的。(inline函數(shù)在編譯時被展開讽营,虛函數(shù)在運行時才能動態(tài)的邦定函數(shù))
inline函數(shù)和virtual函數(shù)有著本質(zhì)的區(qū)別虎忌,inline函數(shù)是在程序被編譯時就展開,在函數(shù)調(diào)用處用整個函數(shù)體去替換橱鹏,而virtual函數(shù)是在運行期才能夠確定如何去調(diào)用的膜蠢,因而inline函數(shù)體現(xiàn)的是一種編譯期機制,virtual函數(shù)體現(xiàn)的是一種運行期機制莉兰。此外挑围,一切virtual函數(shù)都不可能是inline函數(shù)。
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)對于每個類來說只有一份代碼糖荒,所有的對象都共享這一份代碼杉辙,他也沒有要動態(tài)邦定的必要性。不能被繼承捶朵,只屬于該類蜘矢。
友元函數(shù)
因為C++不支持友元函數(shù)的繼承狂男,對于沒有繼承特性的函數(shù)沒有虛函數(shù)的說法。友元函數(shù)不屬于類的成員函數(shù)品腹,不能被繼承岖食。
26. C++中虛函數(shù)如何定義,使用時應(yīng)該注意什么舞吭?
如上
27. C++拷貝構(gòu)造函數(shù)和賦值用算符有那些不同和相同點泡垃?
相同點:實現(xiàn)復制功能
不同點:copy:源對象存在而目標對象未被創(chuàng)建
=:源對象和目標對象都不存在
28. 評價多繼承的優(yōu)點和缺點。
多重繼承的優(yōu)點是對象可以調(diào)用多個基類中的接口具備多個基類的特性羡鸥。
多重繼承的缺點是容易出現(xiàn)繼承向上的二義性蔑穴,會造成冗余和浪費。
29. 什么是虛指針惧浴?
用virtual關(guān)鍵字申明的函數(shù)叫做虛函數(shù)澎剥,虛函數(shù)肯定是類的成員函數(shù)。
存在虛函數(shù)的類都有一個一維的虛函數(shù)表叫做虛表赶舆。類的對象有一個指向虛表開始的虛指針。虛表是和類對應(yīng)的祭饭,虛表指針是和對象對應(yīng)的芜茵。
30. 虛函數(shù)的入口地址和普通函數(shù)有什么不同?
每個虛函數(shù)都在vtable中占了一個表項倡蝙,保存真一條跳到它的入口地址的指令(實際上就是保存了它的入口地址)九串。當一個包含虛函數(shù)的對象(注意,不是對象的指針)被創(chuàng)建的時候寺鸥,它在頭部附加了一個指針猪钮,指向vtable中相應(yīng)的位置。
調(diào)用虛函數(shù)的時候胆建,不管你是用什么指針調(diào)用烤低,它先根據(jù)vtable找到入口地址再執(zhí)行,從而實現(xiàn)了“動態(tài)聯(lián)編”笆载。
普通函數(shù)只是簡單的跳到一個固定的地址扑馁。

31--45

**31. **
1、C++中如何阻止一個類被實例化凉驻?
使用抽象類腻要,或者將構(gòu)造函數(shù)聲明為private。
2涝登、一般在什么時候構(gòu)造函數(shù)被聲明成private呢雄家?
比如要阻止編譯器生成默認的拷貝構(gòu)造函數(shù)的時候。
3胀滚、什么時候編譯器會生成默認的 copy constructor呢趟济?
只要自己沒寫乱投,而程序需要,都會生成咙好。
4篡腌、如果你已經(jīng)寫了一個拷貝構(gòu)造函數(shù),編譯器還會生成copy constructor勾效?

32. structure是否可以擁有constructor/destructor以及成員函數(shù)嘹悼?
如果可以那么structor和class有什么區(qū)別.
可以,區(qū)別在上面层宫。
33. 析構(gòu)函數(shù)可以是內(nèi)聯(lián)函數(shù)嗎杨伙?
可以。
34. 編寫string的構(gòu)造函數(shù)萌腿,析構(gòu)函數(shù)限匣,和賦值函數(shù)。
//普通構(gòu)造函數(shù)
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 得分點:對空字符串自動申請存放結(jié)束標志'\0'的//加分點:對m_data加NULL 判斷
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判斷則更好
strcpy(m_data, str);
}
}
// String的析構(gòu)函數(shù)
String::~String(void)
{
delete [] m_data; // 或delete m_data;
}
//拷貝構(gòu)造函數(shù)
String::String(const String &other)    // 得分點:輸入?yún)?shù)為const型
{
int length = strlen(other.m_data);
m_data = new char[length+1];     //加分點:對m_data加NULL 判斷
strcpy(m_data, other.m_data);
}
//賦值函數(shù)
String & String::operate =(const String &other) // 得分點:輸入?yún)?shù)為const 型
{
if(this == &other)   //得分點:檢查自賦值
return *this;
delete [] m_data;     //得分點:釋放原有的內(nèi)存資源
int length = strlen( other.m_data );
m_data = new char[length+1];  //加分點:對m_data加NULL 判斷
strcpy( m_data, other.m_data );
return *this;         //得分點:返回本對象的引用

}

35. 什么是多態(tài)毁菱?
在上面
36. 重載和覆蓋有什么不同米死?
重載與覆蓋的區(qū)別
1、方法的覆蓋是子類和父類之間的關(guān)系贮庞,是垂直關(guān)系峦筒;方法的重載是同一個類中方法之間的關(guān)系,是水平關(guān)系窗慎。
2物喷、覆蓋只能由一個方法,或只能由一對方法產(chǎn)生關(guān)系遮斥;方法的重載是多個方法之間的關(guān)系峦失。
3、覆蓋要求參數(shù)列表相同术吗;重載要求參數(shù)列表不同尉辑。
4、覆蓋關(guān)系中较屿,調(diào)用那個方法體材蹬,是根據(jù)對象的類型(對象對應(yīng)存儲空間類型)來決定;重載關(guān)系吝镣,是根據(jù)調(diào)用時的實參表與形參表來選擇方法體的堤器。
37. what is v-table and v-ptr in C++? what is the relationship between them?
在上面
38.C和C++中如何讓動態(tài)分配合釋放內(nèi)存?他們的區(qū)別是什么末贾?
Malloc和new的那個就是闸溃,在上面
39. C和C++的struct有什么不同
C語言中:Struct是用戶自定義數(shù)據(jù)類型(UDT)。
C++語言中:Struct是抽象數(shù)據(jù)類型(ADT),支持成員函數(shù)的定義辉川。struct的成員的默認訪問說明符為public表蝙,class為private。
C:struct是沒有權(quán)限設(shè)置的乓旗。
C++:struct增加了訪問權(quán)限,且可以和類一樣有成員函數(shù)府蛇。
C++中的struct等同于class,只是class默認成員權(quán)限是private,而struct默認成員權(quán)限是public。
在標準C++中屿愚,struct和class有兩個區(qū)別:
第一:struct中的成員默認是public的汇跨,class中的默認是private的。
第二:在用模版的時候只能寫template <class Type>或template <typename Type>不能寫template <struct Type>妆距。
此外穷遂,如果沒有多態(tài)和虛擬繼承,在C++中娱据,struct和class的存取效率完全相同!簡單的說就是中剩,存取class的data member和非virtual function效率和struct完全相同忌穿!不管該data member是定義在基類還是派生類的结啼。
C++:struct可以當作class來用沸伏,他和C++中class的唯一的區(qū)別是毅糟,class中的成員默認是private,而struct的成員默認為public红选。
C:struct只能是一些變量的集合體喇肋,可以封裝數(shù)據(jù)卻不可以隱藏數(shù)據(jù),而且成員不可以是函數(shù)迹辐。
如果不是為了和C兼容蝶防,C++中就不會有struct關(guān)鍵字。
40. 為了實現(xiàn)C++中的多態(tài)性明吩,編譯器做了哪些事情间学?也就是說C++語言內(nèi)部怎么實現(xiàn)多態(tài)?
在上面
41. 函數(shù)前的static和volatile變量中關(guān)鍵字作用
volatile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改低葫,
遇到這個關(guān)鍵字聲明的變量详羡,編譯器對訪問該變量的代碼就不再進行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問嘿悬。
static 聲明的變量在C語言中有兩方面的特征:
1)实柠、變量會被放在程序的全局存儲區(qū)中,這樣可以在下一次調(diào)用的時候還可以保持原來的賦值善涨。這一點是它與堆棧變量和堆變量的區(qū)別窒盐。
2)、變量用static告知編譯器躯概,自己僅僅在變量的作用范圍內(nèi)可見登钥。這一點是它與全局變量的區(qū)別。
42. 使用C++賦值運算符應(yīng)注意什么地方娶靡?(答案是重載的情況下)
1.返回類型
必須為該類型的引用
原因:必須返回一個引用牧牢,才可以允許連續(xù)賦值 ;
必須返回自身實例的引用(this)
2.參數(shù)
傳入?yún)?shù)申明為常量引用
如果傳入的參數(shù)不是引用而是實例姿锭,那么從形參到實參會調(diào)用一次復制構(gòu)造函數(shù)塔鳍;
傳入?yún)?shù)和當前的實例(
this)是否為同一實例.
3.釋放實例自身已有的類型,防止內(nèi)存泄露呻此;
4.考慮當因內(nèi)存不足在new char時候拋出異常
43. 請用你熟悉的開發(fā)語言實現(xiàn)一個單例模型Singleton(單例模型:即只有一個對象的類)
面試題講
44. 用C++語言實現(xiàn)單例模式(Singleton)時轮纫,如何確保調(diào)用者無法通過正常手段創(chuàng)建出第二個對象?
構(gòu)造函數(shù)私有
45. 簡述C++語言中的dynamic_cast相對于C語言中強制類型轉(zhuǎn)換的必要性.
1.用在多態(tài)的子類情況下,父類不能提供處理接口,這時可以針對子類做特殊的處理焚鲜。
2.dynamic_cast比另外3個cast優(yōu)勢就是會對轉(zhuǎn)換進行檢查掌唾,如果出錯,會報錯忿磅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糯彬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葱她,更是在濱河造成了極大的恐慌撩扒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨些,死亡現(xiàn)場離奇詭異搓谆,居然都是意外死亡,警方通過查閱死者的電腦和手機豪墅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門泉手,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偶器,你說我怎么就攤上這事螃诅》惹猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵术裸,是天一觀的道長倘是。 經(jīng)常有香客問我,道長袭艺,這世上最難降的妖魔是什么搀崭? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮猾编,結(jié)果婚禮上瘤睹,老公的妹妹穿的比我還像新娘。我一直安慰自己答倡,他們只是感情好轰传,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘪撇,像睡著了一般获茬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倔既,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天恕曲,我揣著相機與錄音,去河邊找鬼渤涌。 笑死佩谣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的实蓬。 我是一名探鬼主播茸俭,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼安皱!你這毒婦竟也來了调鬓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤练俐,失蹤者是張志新(化名)和其女友劉穎袖迎,沒想到半個月后冕臭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腺晾,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年辜贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了悯蝉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡托慨,死狀恐怖鼻由,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蕉世,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蔼紧,位于F島的核電站,受9級特大地震影響狠轻,放射性物質(zhì)發(fā)生泄漏奸例。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一向楼、第九天 我趴在偏房一處隱蔽的房頂上張望查吊。 院中可真熱鬧,春花似錦湖蜕、人聲如沸逻卖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽评也。三九已至,卻和暖如春戈鲁,著一層夾襖步出監(jiān)牢的瞬間仇参,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工婆殿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈乒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓婆芦,卻偏偏與公主長得像怕磨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子消约,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評論 1 51
  • 1. C++基礎(chǔ)知識點 1.1 有符號類型和無符號類型 當我們賦給無符號類型一個超出它表示范圍的值時肠鲫,結(jié)果是初始值...
    Mr希靈閱讀 17,935評論 3 82
  • 1.面向?qū)ο蟮某绦蛟O(shè)計思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進行操作的方法封裝形成一個個的對象或粮。 2.什么是類导饲?...
    少帥yangjie閱讀 4,988評論 0 14
  • 一個博客,這個博客記錄了他讀這本書的筆記氯材,總結(jié)得不錯渣锦。《深度探索C++對象模型》筆記匯總 1. C++對象模型與內(nèi)...
    Mr希靈閱讀 5,566評論 0 13
  • 1. 結(jié)構(gòu)體和共同體的區(qū)別氢哮。 定義: 結(jié)構(gòu)體struct:把不同類型的數(shù)據(jù)組合成一個整體袋毙,自定義類型。共同體uni...
    breakfy閱讀 2,112評論 0 22