1. 面向?qū)ο蟮某绦蛟O(shè)計思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進行操作的方法封裝形成一個個的對象。 2. 什么是類? 答:把一些具有共性的對象歸類后形成一個集合,也就是所謂的類。 3. 對象都具有的兩方面特征是什么?分別是什么含義? 答:對象都具有的特征是:靜態(tài)特征和動態(tài)特征。 靜態(tài)特征是指能描述對象的一些屬性(成員變量),動態(tài)特征是指對象表現(xiàn)出來的行為(成員函數(shù)) 4. 在頭文件中進行類的聲明,在對應(yīng)的實現(xiàn)文件中進行類的定義有什么意義? 答:這樣可以提高編譯效率,因為分開的話只需要編譯一次生成對應(yīng)的.obj文件后,再次應(yīng)用該類的地方,這個類就不會被再次編譯,從而大大的提高了編譯效率。 5. 在類的內(nèi)部定義成員函數(shù)的函數(shù)體,這種函數(shù)會具備那種屬性? 答:這種函數(shù)會自動為內(nèi)聯(lián)函數(shù),這種函數(shù)在函數(shù)調(diào)用的地方在編譯階段都會進行代碼替換。 6. 成員函數(shù)通過什么來區(qū)分不同對象的成員數(shù)據(jù)?為什么它能夠區(qū)分? 答:通過this指針指向?qū)ο蟮氖椎刂穪韰^(qū)分的。 7. C++編譯器自動為類產(chǎn)生的四個缺省函數(shù)是什么? 答:默認構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),析構(gòu)函數(shù),賦值函數(shù)。 8. 拷貝構(gòu)造函數(shù)在哪幾種情況下會被調(diào)用? 答: 1.當(dāng)類的一個對象去初始化該類的另一個對象時; 2.如果函數(shù)的形參是類的對象,調(diào)用函數(shù)進行形參和實參結(jié)合時; 3.如果函數(shù)的返回值是類對象,函數(shù)調(diào)用完成返回時。 9. 構(gòu)造函數(shù)與普通函數(shù)相比在形式上有什么不同?(構(gòu)造函數(shù)的作用,它的聲明形式來分析) 答:構(gòu)造函數(shù)是類的一種特殊成員函數(shù),一般情況下,它是專門用來初始化對象成員變量的。 構(gòu)造函數(shù)的名字必須與類名相同,它不具有任何類型,不返回任何值。 10. 什么時候必須重寫拷貝構(gòu)造函數(shù)? 答:當(dāng)構(gòu)造函數(shù)涉及到動態(tài)存儲分配空間時,要自己寫拷貝構(gòu)造函數(shù),并且要深拷貝。 11. 構(gòu)造函數(shù)的調(diào)用順序是什么? 答:1.先調(diào)用基類構(gòu)造函數(shù) 2.按聲明順序初始化數(shù)據(jù)成員 3.最后調(diào)用自己的構(gòu)造函數(shù)。 12. 哪幾種情況必須用到初始化成員列表? 答:類的成員是常量成員初始化; 類的成員是對象成員初始化,而該對象沒有無參構(gòu)造函數(shù)。 類的成員為引用時。 13. 什么是常對象? 答:常對象是指在任何場合都不能對其成員的值進行修改的對象。 14. 靜態(tài)函數(shù)存在的意義? 答:靜態(tài)私有成員在類外不能被訪問,可通過類的靜態(tài)成員函數(shù)來訪問; 當(dāng)類的構(gòu)造函數(shù)是私有的時,不像普通類那樣實例化自己,只能通過靜態(tài)成員函數(shù)來調(diào)用構(gòu)造函數(shù)。 15. 在類外有什么辦法可以訪問類的非公有成員? 答:友元,繼承,公有成員函數(shù)。 16. 什么叫抽象類? 答:不用來定義對象而只作為一種基本類型用作繼承的類。 17. 運算符重載的意義? 答:為了對用戶自定義數(shù)據(jù)類型的數(shù)據(jù)的操作與內(nèi)定義的數(shù)據(jù)類型的數(shù)據(jù)的操作形式一致。 18. 不允許重載的5個運算符是哪些? 答: 1. .*(成員指針訪問運算符號) 2. ::域運算符 3. Sizeof 長度運算符號 4. ?:條件運算符號 5. .(成員訪問符) 19. 運算符重載的三種方式? 答:普通函數(shù),友元函數(shù),類成員函數(shù)。 20. 流運算符為什么不能通過類的成員函數(shù)重載?一般怎么解決? 答:因為通過類的成員函數(shù)重載必須是運算符的第一個是自己,而對流運算的重載要求第一個參數(shù)是流對象。所以一般通過友元來解決。 21. 賦值運算符和拷貝構(gòu)造函數(shù)的區(qū)別與聯(lián)系? 答:相同點:都是將一個對象copy到另一個中去。 不同點:拷貝構(gòu)造函數(shù)涉及到要新建立一個對象。 22. 在哪種情況下要調(diào)用該類的析構(gòu)函數(shù)? 答:對象生命周期結(jié)束時。 23. 對象間是怎樣實現(xiàn)數(shù)據(jù)的共享的? 答:通過類的靜態(tài)成員變量來實現(xiàn)對象間的數(shù)據(jù)共享。靜態(tài)成員變量占有自己獨立的空間不為某個對象所私有。 24. 友元關(guān)系有什么特性? 答:單向的,非傳遞的,不能繼承的。 25. 對對象成員進行初始化的次序是什么? 答:它的次序完全不受它們在初始化表中次序的影響,只有成員對象在類中聲明的次序來決定的。 26. 類和對象之間的關(guān)系是什么? 答:類是對象的抽象,對象是類的實例。 27. 對類的成員的訪問屬性有什么? 答:public,protected,private。 28.const char *p和char * const p; 的區(qū)別 答: 如果const位于星號的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞?/strong>,即指針指向為常量; 如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。 29. 是不是一個父類寫了一個virtual 函數(shù),如果子類覆蓋它的函數(shù)不加virtual ,也能實現(xiàn)多態(tài)? 答: virtual修飾符會被隱形繼承的。 virtual可加可不加,子類覆蓋它的函數(shù)不加virtual ,也能實現(xiàn)多態(tài)。 30. 函數(shù)重載是什么意思?它與虛函數(shù)的概念有什么區(qū)別? 答:函數(shù)重載是一個同名函數(shù)完成不同的功能,編譯系統(tǒng)在編譯階段通過函數(shù)參數(shù)個數(shù)、參數(shù)類型不同,函數(shù)的返回值來區(qū)分該調(diào)用哪一個函數(shù),即實現(xiàn)的是靜態(tài)的多態(tài)性。但是記?。翰荒軆H僅通過函數(shù)返回值不同來實現(xiàn)函數(shù)重載。而虛函數(shù)實現(xiàn)的是在基類中通過使用關(guān)鍵字virtual來申明一個函數(shù)為虛函數(shù),含義就是該函數(shù)的功能可能在將來的派生類中定義或者在基類的基礎(chǔ)之上進行擴展,系統(tǒng)只能在運行階段才能動態(tài)決定該調(diào)用哪一個函數(shù),所以實現(xiàn)的是動態(tài)的多態(tài)性。它體現(xiàn)的是一個縱向的概念,也即在基類和派生類間實現(xiàn)。 31. 構(gòu)造函數(shù)和析構(gòu)函數(shù)是否可以被重載,為什么? 答:構(gòu)造函數(shù)可以被重載,析構(gòu)函數(shù)不可以被重載。因為構(gòu)造函數(shù)可以有多個且可以帶參數(shù),而析構(gòu)函數(shù)只能有一個,且不能帶參數(shù)。 32. 如何定義和實現(xiàn)一個類的成員函數(shù)為回調(diào)函數(shù)? 答: 所謂的回調(diào)函數(shù),就是預(yù)先在系統(tǒng)的對函數(shù)進行注冊,讓系統(tǒng)知道這個函數(shù)的存在,以后,當(dāng)某個事件發(fā)生時,再調(diào)用這個函數(shù)對事件進行響應(yīng)。 定義一個類的成員函數(shù)時在該函數(shù)前加CALLBACK即將其定義為回調(diào)函數(shù),函數(shù)的實現(xiàn)和普通成員函數(shù)沒有區(qū)別 33. 虛函數(shù)是怎么實現(xiàn)的? 答:簡單說來使用了虛函數(shù)表. 34. 抽象類不會產(chǎn)生實例,所以不需要有構(gòu)造函數(shù)。 錯 35. 從一個模板類可以派生新的模板類,也可以派生非模板類。 對 36. main 函數(shù)執(zhí)行以前,還會執(zhí)行什么代碼? 答案:全局對象的構(gòu)造函數(shù)會在main 函數(shù)之前執(zhí)行。 37. 當(dāng)一個類A 中沒有生命任何成員變量與成員函數(shù),這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk) 答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數(shù)組,而每一個對象占用的空間是零,這時就沒辦法區(qū)分A[0],A[1]…了。 38. delete與 delete []區(qū)別: 答:delete只會調(diào)用一次析構(gòu)函數(shù),而delete[]會調(diào)用每一個成員的析構(gòu)函數(shù)。 39.子類析構(gòu)時要調(diào)用父類的析構(gòu)函數(shù)嗎? 答:會調(diào)用。析構(gòu)函數(shù)調(diào)用的次序是先派生類的析構(gòu)后基類的析構(gòu),也就是說在基類的的析構(gòu)調(diào)用的時候,派生類的信息已經(jīng)全部銷毀了 40. 繼承的優(yōu)缺點。 1、類繼承是在編譯時刻靜態(tài)定義的,且可直接使用, 2、類繼承可以較方便地改變父類的實現(xiàn)。 缺點: 1、因為繼承在編譯時刻就定義了,所以無法在運行時刻改變從父類繼承的實現(xiàn) 2、父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為 3、如果繼承下來的實現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。 41. 解釋堆和棧的區(qū)別。 答:棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。 堆(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。 42. 一個類的構(gòu)造函數(shù)和析構(gòu)函數(shù)什么時候被調(diào)用,是否需要手工調(diào)用? 答:構(gòu)造函數(shù)在創(chuàng)建類對象的時候被自動調(diào)用,析構(gòu)函數(shù)在類對象生命期結(jié)束時,由系統(tǒng)自動調(diào)用。 43. 何時需要預(yù)編譯: 答:總是使用不經(jīng)常改動的大型代碼體。 程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。 44. 多態(tài)的作用? 答:主要是兩個: 1. 隱藏實現(xiàn)細節(jié),使得代碼能夠模塊化;擴展代碼模塊,實現(xiàn)代碼重用; 2. 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調(diào)用 45. 虛擬函數(shù)與普通成員函數(shù)的區(qū)別?內(nèi)聯(lián)函數(shù)和構(gòu)造函數(shù)能否為虛擬函數(shù)? 答案:區(qū)別:虛擬函數(shù)有virtual關(guān)鍵字,有虛擬指針和虛函數(shù)表,虛擬指針就是虛擬函數(shù)的接口,而普通成員函數(shù)沒有。內(nèi)聯(lián)函數(shù)和構(gòu)造函數(shù)不能為虛擬函數(shù)。 46. 構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序? 析構(gòu)函數(shù)為什么要虛擬? 答案:構(gòu)造函數(shù)的調(diào)用順序:基類構(gòu)造函數(shù)—對象成員構(gòu)造函數(shù)—派生類構(gòu)造函數(shù);析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)虛擬是為了防止析構(gòu)不徹底,造成內(nèi)存的泄漏。 47. C++中類型為private的成員變量可以由哪些函數(shù)訪問? 答:只可以由本類中的成員函數(shù)和友元函數(shù)訪問 48. 請說出類中private,protect,public三種訪問限制類型的區(qū)別 答:private是私有類型,只有本類中的成員函數(shù)訪問;protect是保護型的,本類和繼承類可以訪問;public是公有類型,任何類都可以訪問. 49. 類中成員變量怎么進行初始化? 答:可以通過構(gòu)造函數(shù)的初始化列表或構(gòu)造函數(shù)的函數(shù)體實現(xiàn)。 50. 在什么時候需要使用“常引用”? 答:如果既要利用引用提高程序的效率,又要保護傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。 |
|