《逆襲進大廠》系列之C++篇No.111-120
本文源自于個人github倉庫:https://github.com/forthespada/InterviewGuide
github倉庫內(nèi)有PDF版本下載方式,歡迎各位star、fork~
立志收錄計算機校招、社招面試最全面試八股文,無內(nèi)鬼來點八股文~
111、 繼承機制中對象之間如何轉(zhuǎn)換?指針和引用之間如何轉(zhuǎn)換?
1) 向上類型轉(zhuǎn)換
將派生類指針或引用轉(zhuǎn)換為基類的指針或引用被稱為向上類型轉(zhuǎn)換,向上類型轉(zhuǎn)換會自動進行,而且向上類型轉(zhuǎn)換是安全的。
2) 向下類型轉(zhuǎn)換
將基類指針或引用轉(zhuǎn)換為派生類指針或引用被稱為向下類型轉(zhuǎn)換,向下類型轉(zhuǎn)換不會自動進行,因為一個基類對應(yīng)幾個派生類,所以向下類型轉(zhuǎn)換時不知道對應(yīng)哪個派生類,所以在向下類型轉(zhuǎn)換時必須加動態(tài)類型識別技術(shù)。RTTI技術(shù),用dynamic_cast進行向下類型轉(zhuǎn)換。
112、知道C++中的組合嗎?它與繼承相比有什么優(yōu)缺點嗎?
一:繼承
繼承是Is a 的關(guān)系,比如說Student繼承Person,則說明Student is a Person。繼承的優(yōu)點是子類可以重寫父類的方法來方便地實現(xiàn)對父類的擴展。
繼承的缺點有以下幾點:
①:父類的內(nèi)部細節(jié)對子類是可見的。
②:子類從父類繼承的方法在編譯時就確定下來了,所以無法在運行期間改變從父類繼承的方法的行為。
③:如果對父類的方法做了修改的話(比如增加了一個參數(shù)),則子類的方法必須做出相應(yīng)的修改。所以說子類與父類是一種高耦合,違背了面向?qū)ο笏枷搿?/p>
二:組合
組合也就是設(shè)計類的時候把要組合的類的對象加入到該類中作為自己的成員變量。
組合的優(yōu)點:
①:當前對象只能通過所包含的那個對象去調(diào)用其方法,所以所包含的對象的內(nèi)部細節(jié)對當前對象時不可見的。
②:當前對象與包含的對象是一個低耦合關(guān)系,如果修改包含對象的類中代碼不需要修改當前對象類的代碼。
③:當前對象可以在運行時動態(tài)的綁定所包含的對象??梢酝ㄟ^set方法給所包含對象賦值。
組合的缺點:①:容易產(chǎn)生過多的對象。②:為了能組合多個對象,必須仔細對接口進行定義。
113、函數(shù)指針?
1) 什么是函數(shù)指針?
函數(shù)指針指向的是特殊的數(shù)據(jù)類型,函數(shù)的類型是由其返回的數(shù)據(jù)類型和其參數(shù)列表共同決定的,而函數(shù)的名稱則不是其類型的一部分。
一個具體函數(shù)的名字,如果后面不跟調(diào)用符號(即括號),則該名字就是該函數(shù)的指針(注意:大部分情況下,可以這么認為,但這種說法并不很嚴格)。
2) 函數(shù)指針的聲明方法
int (*pf)(const int&, const int&); (1)
上面的pf就是一個函數(shù)指針,指向所有返回類型為int,并帶有兩個const int&參數(shù)的函數(shù)。注意*pf兩邊的括號是必須的,否則上面的定義就變成了:
int *pf(const int&, const int&); (2)
而這聲明了一個函數(shù)pf,其返回類型為int *, 帶有兩個const int&參數(shù)。
3) 為什么有函數(shù)指針
函數(shù)與數(shù)據(jù)項相似,函數(shù)也有地址。我們希望在同一個函數(shù)中通過使用相同的形參在不同的時間使用產(chǎn)生不同的效果。
4) 一個函數(shù)名就是一個指針,它指向函數(shù)的代碼。一個函數(shù)地址是該函數(shù)的進入點,也就是調(diào)用函數(shù)的地址。函數(shù)的調(diào)用可以通過函數(shù)名,也可以通過指向函數(shù)的指針來調(diào)用。函數(shù)指針還允許將函數(shù)作為變元傳遞給其他函數(shù);
5) 兩種方法賦值:
指針名 = 函數(shù)名; 指針名 = &函數(shù)名
114、 內(nèi)存泄漏的后果?如何監(jiān)測?解決方法?
1) 內(nèi)存泄漏
內(nèi)存泄漏是指由于疏忽或錯誤造成了程序未能釋放掉不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計錯誤,失去了對該段內(nèi)存的控制;
2) 后果
只發(fā)生一次小的內(nèi)存泄漏可能不被注意,但泄漏大量內(nèi)存的程序?qū)霈F(xiàn)各種證照:性能下降到內(nèi)存逐漸用完,導(dǎo)致另一個程序失?。?/p>
3) 如何排除
使用工具軟件BoundsChecker,BoundsChecker是一個運行時錯誤檢測工具,它主要定位程序運行時期發(fā)生的各種錯誤;
調(diào)試運行DEBUG版程序,運用以下技術(shù):CRT(C run-time libraries)、運行時函數(shù)調(diào)用堆棧、內(nèi)存泄漏時提示的內(nèi)存分配序號(集成開發(fā)環(huán)境OUTPUT窗口),綜合分析內(nèi)存泄漏的原因,排除內(nèi)存泄漏。
4)
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
- 本專欄成功幫助阿秀拿到字節(jié)跳動SP的offer,脫胎于個人秋招時期的筆記總結(jié)。其中收納C++(217道)、操作系統(tǒng)(62道)、計算機網(wǎng)絡(luò)(100道)、數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)據(jù)庫(MySQL、Redis)等高頻問答知識點。 - 本專欄適合于校招、社招等找工作黨,后來逐漸收錄一些學(xué)弟學(xué)妹的上岸經(jīng)驗和方法,歡迎訂閱,持續(xù)更新ing。