C++面試題目總結(jié)

C++??碱}目參考本

1、指針和引用的區(qū)別?

實(shí)體與別名

內(nèi)存分配,指針需要引用不需要

sizeof() 對象的大小和本身的大小

引用不能為空

2、堆和棧的區(qū)別

堆自己申請自己釋放,new/delete

棧自動分配與釋放? ? 函數(shù)參數(shù)、局部變量、臨時變量

全局區(qū)? 全局變量與靜態(tài)變量放在一起

文字常量區(qū)? 常量字符串

程序代碼區(qū)? ? 函數(shù)的二進(jìn)制代碼

3、 new和delete是如何實(shí)現(xiàn)的,new 與 malloc的異同處

n/d 底層封裝的是m/f

m/f標(biāo)準(zhǔn)庫函數(shù),n/d是運(yùn)算符

m/f對非內(nèi)部類型無用

C只能用 m/f

開辟一個指針 new有類型信息,m則返回的是void指針

4、C/C++區(qū)別

過程、對象,結(jié)構(gòu)化語言重點(diǎn)在算法和結(jié)構(gòu)

C++引入了類這一概念

5、 C++、Java的聯(lián)系與區(qū)別,包括語言特性、垃圾回收、應(yīng)用場景等(java的垃圾回收機(jī)制)6、Struct和class的區(qū)別

數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體/對象的實(shí)現(xiàn)體

public/private

7、define 和const的區(qū)別(編譯階段、安全性、內(nèi)存占用等)

簡單替換無安全類型檢查/有類型檢查

有些編譯器可對后者進(jìn)行調(diào)試

const節(jié)省空間避免不必要的內(nèi)存分配

8、 在C++中const和static的用法(定義,用途)

const 只讀變量、函數(shù)參數(shù)和返回值、成員函數(shù)不可修改成員數(shù)據(jù)

靜態(tài)變量

隱藏作用? 多文件時只在本文件內(nèi)可見

具有記憶功能 ,全局生存期

全局變量默認(rèn)初值為0

對于類中

靜態(tài)成員屬于整個類兒不是對象無this指針

靜態(tài)成員函數(shù)不能定義為虛函數(shù)

靜態(tài)數(shù)據(jù)成員必須初始化(類外)

9、 const和static在類中使用的注意事項(xiàng)(定義、初始化和使用)

同上

10、? C++中的const類成員函數(shù)(用法和意義)

可以與非const函數(shù)重載

const與非const同時出現(xiàn)時,非調(diào)非,只要const對象非可調(diào)用const

const成員變量在初始化列表中進(jìn)行

const數(shù)據(jù)成員

引用

類成員為沒有默認(rèn)構(gòu)造函數(shù)的類類型

如果類存在繼承關(guān)系,派生類必須在其初始化列表中調(diào)用基類的構(gòu)造函數(shù)

初始化類對象.因?yàn)槿绻皇窃诔跏蓟斜碇谐跏蓟?,該類對象的?gòu)造函數(shù)會調(diào)用兩次,這個開銷顯然有點(diǎn)大

11、 計算下面幾個類的大小: class A {};: sizeof(A) = 1; class A { virtual Fun(){} };: sizeof(A) = 4(32位機(jī)器)/8(64位機(jī)器); class A { static int a; };: sizeof(A) = 1; class A { int a; };: sizeof(A) = 4; class A { static int a; int b; };: sizeof(A) = 4;12、? 給一個代碼,求輸出結(jié)果 class A { public: A(int x){} } 問:A a = 1;是否正確, 如果正確, 那么它調(diào)用了哪些函數(shù)? 這類題目更常見的是在基類和子類有不同實(shí)現(xiàn)方法。(虛函數(shù)相關(guān),栗子很多,不多說了)13、 C++的STL介紹(這個系列也很重要,建議侯捷老師的這方面的書籍與視頻),其中包括內(nèi)存管理allocator,函數(shù),實(shí)現(xiàn)機(jī)理,多線程實(shí)現(xiàn)等14 、STL源碼中的hash表的實(shí)現(xiàn)15 、STL中unordered_map和map的區(qū)別16、 STL中vector的實(shí)現(xiàn)17、 vector使用的注意點(diǎn)及其原因,頻繁對vector調(diào)用push_back()對性能的影響和原因。18、 C++中的重載和重寫的區(qū)別:

重載是根據(jù)參數(shù)表確定調(diào)用哪個函數(shù),不關(guān)心返回類型,C語言沒有重載,C++編譯器根據(jù)函數(shù)不同的參數(shù)表對同名函數(shù)做修飾,對函數(shù)的調(diào)用在編譯期間就存在了,重載與多態(tài)無關(guān)

子類重新定義父類虛函數(shù)

重寫與多態(tài)真正相關(guān),當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦予它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),因此函數(shù)地址是在運(yùn)行期綁定的

19、C ++內(nèi)存管理(熱門問題)鏈接

五個區(qū)? 堆 棧? 自由存儲區(qū)、全局/靜態(tài)? 常量存儲區(qū)

自由存儲區(qū)是C++基于new操作符的一個抽象概念,由new申請的為常量存儲區(qū)

20 、介紹面向?qū)ο蟮娜筇匦?,并且舉例說明每一個。

封裝: 客觀事物封裝成類,并擁有自己數(shù)據(jù)和方法讓自己可信的類和對象進(jìn)行操作,對不可信的進(jìn)行隱藏

繼承: 可以使用現(xiàn)有類的所有功能,實(shí)現(xiàn)代碼的重用

多態(tài):具有不同功能的函數(shù)可以用同一函數(shù)名,這樣就可以用一個函數(shù)名調(diào)用不同內(nèi)容的函數(shù)

21、 多態(tài)的實(shí)現(xiàn)(和下個問題一起回答)22、? C++虛函數(shù)相關(guān)(虛函數(shù)表,虛函數(shù)指針),虛函數(shù)的實(shí)現(xiàn)原理(熱門,重要)

虛函數(shù)表與虛指針

虛函數(shù)指針:在含有虛函數(shù)類的對象中,指向虛函數(shù)表,在運(yùn)行時確定

虛函數(shù)表:在程序中的只讀數(shù)據(jù)段,存放虛函數(shù)指針,如果派生類實(shí)現(xiàn)了積累的某個虛函數(shù),則在虛表中覆蓋原本基類的那個虛函數(shù)指針,在編譯階段根據(jù)類的聲明創(chuàng)建

虛函數(shù)表的構(gòu)造過程

拷貝基類虛函數(shù)表

替換已重寫虛函數(shù)指針

添加自己虛函數(shù)指針

23、? 實(shí)現(xiàn)編譯器處理虛函數(shù)表應(yīng)該如何處理24、? 析構(gòu)函數(shù)一般寫成虛函數(shù)的原因

?? ? ? ? ? 因?yàn)樵谟?b>基類指針指向派生類時,析構(gòu)函數(shù)執(zhí)行是先調(diào)用派生類的析構(gòu)函數(shù),其次調(diào)用基類的析構(gòu)函數(shù)。如果析構(gòu)函數(shù)不是虛函數(shù),而程序執(zhí)行時又要通過基類的指針去銷派生類的動態(tài)對象,那么在delete時只調(diào)用了基類的析構(gòu)函數(shù)

?? ? ? ? ? 定義了析構(gòu)函數(shù)一定要再定義拷貝構(gòu)造函數(shù)與賦值構(gòu)造函數(shù)

25、 構(gòu)造函數(shù)為什么一般不定義為虛函數(shù)

虛函數(shù)的作用是實(shí)現(xiàn)部分和默認(rèn)的功能,故父類為虛析構(gòu)函數(shù)則子類會覆蓋掉父類的構(gòu)造函數(shù),失去了一些初始化功能

虛函數(shù)調(diào)用虛函數(shù)表構(gòu)造對象的時候還沒有為虛函數(shù)表分配內(nèi)存,違背了先實(shí)例化后調(diào)用的準(zhǔn)則

對象的創(chuàng)建需要在編譯的過程中確定,多態(tài)是在運(yùn)行過程中實(shí)現(xiàn)的

26、 構(gòu)造函數(shù)或者析構(gòu)函數(shù)中調(diào)用虛函數(shù)會怎樣

?? ? ? 假設(shè)我們在基類的構(gòu)造函數(shù)中調(diào)用派生類的某個函數(shù)去訪問其他成員,這會派生類的對象還沒構(gòu)建完成,怎么能訪問呢?

于是C++禁止了這種行為

27、 純虛函數(shù)

純虛函數(shù)只是個接口是個函數(shù)的聲明,要留到子類中去實(shí)現(xiàn)

含有純虛函數(shù)的類是基類

我們不能創(chuàng)建抽象基類的對象

28、 靜態(tài)綁定和動態(tài)綁定的介紹? ? 連接

首先明確幾個名詞定義

靜態(tài)類型: 對象在聲明時采用的類型,在編譯期已確定

動態(tài)類型: 通常是指一個指針或引用目前所指的對象的類型,在運(yùn)行期間決定

靜態(tài)綁定: 綁定的是靜態(tài)的類型,所對應(yīng)的的函數(shù)依賴于對象的靜態(tài)類型,發(fā)生在編譯期

動態(tài)綁定: 綁定的是動態(tài)類型,所對應(yīng)的函數(shù)或者屬性依賴于對象的動態(tài)類型

對象的動態(tài)類型可以修改,但是靜態(tài)類型無法修改

在繼承體系內(nèi)只有虛函數(shù)使用的是動態(tài)綁定,其他全部是靜態(tài)綁定

29、? 引用是否能實(shí)現(xiàn)動態(tài)綁定,為什么引用可以實(shí)現(xiàn)

?? ? 因?yàn)閷ο蟮念愋褪谴_定的,在編譯期就確定了

?? ? 指針或引用是在運(yùn)行期根據(jù)他們綁定的具體對象確定的

30、深拷貝和淺拷貝的區(qū)別(舉例說明深拷貝的安全性)

?? ? ? ? 淺拷貝只是對指針的拷貝,拷貝后兩個指針指向同一內(nèi)存空間,深拷貝不但對指針進(jìn)行拷貝,而且對指針指向的內(nèi)容進(jìn)行拷貝,經(jīng)深拷貝后的指針是指向兩個不同地址的指針

?? ? ? ? 當(dāng)有動態(tài)生成的對象時,默認(rèn)拷貝函數(shù)是淺拷貝,指向同一塊內(nèi)存區(qū)域,析構(gòu)時兩次析構(gòu),會有內(nèi)存泄露連接

31 、對象復(fù)用的了解,零拷貝的了解

?? ? ? 如果應(yīng)用程序永遠(yuǎn)不會對這塊數(shù)據(jù)進(jìn)行修改,那么就永遠(yuǎn)不需要將數(shù)據(jù)拷貝到應(yīng)用程序中的地址中去

(32)? ? 介紹C++所有的構(gòu)造函數(shù) (33)? ? 什么情況下會調(diào)用拷貝構(gòu)造函數(shù)(三種情況) (34)? ? 結(jié)構(gòu)體內(nèi)存對齊方式和為什么要進(jìn)行內(nèi)存對齊? (35)? ? 內(nèi)存泄露的定義,如何檢測與避免? (36)? ? 手寫實(shí)現(xiàn)智能指針類(34-37我沒遇見過) (37)? ? 調(diào)試程序的方法 (38)? ? 遇到coredump要怎么調(diào)試 (39)? ? 內(nèi)存檢查工具的了解 (40)? ? 模板的用法與適用場景 (41)? ? 成員初始化列表的概念,為什么用成員初始化列表會快一些(性能優(yōu)勢)? (42)? ? 用過C11嗎,知道C11新特性嗎?(有面試官建議熟悉C11) (43)? ? C++的調(diào)用慣例(簡單一點(diǎn)C++函數(shù)調(diào)用的壓棧過程) (44)? ? C++的四種強(qiáng)制轉(zhuǎn)換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容