C++編譯的過程?
預(yù)處理->編譯->匯編->鏈接。
- 預(yù)處理:
預(yù)處理相當(dāng)于根據(jù)預(yù)處理指令組裝新的C/C++程序。經(jīng)過預(yù)處理,會產(chǎn)生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,這個文件的含義同原本的文件無異,只是內(nèi)容上有所不同。 - 編譯:
將預(yù)處理完的文件進(jìn)行一系列詞法分析、語法分析、語義分析及優(yōu)化后,產(chǎn)生相應(yīng)的匯編代碼文件。 - 匯編:
將編譯完的匯編代碼文件翻譯成機(jī)器指令,并生成可重定位目標(biāo)程序的.o文件,該文件為二進(jìn)制文件,字節(jié)編碼是機(jī)器指令。 - 鏈接:
通過鏈接器將一個個目標(biāo)文件(或許還會有庫文件)鏈接在一起生成一個完整的可執(zhí)行程序。
C++ 編譯過程簡介
靜態(tài)鏈接和動態(tài)鏈接的區(qū)別?
在鏈接過程中,靜態(tài)鏈接和動態(tài)鏈接就出現(xiàn)了區(qū)別。靜態(tài)鏈接的過程就已經(jīng)把要鏈接的內(nèi)容已經(jīng)鏈接到了生成的可執(zhí)行文件中,就算你再去把靜態(tài)庫刪除也不會影響可執(zhí)行程序的執(zhí)行;而動態(tài)鏈接這個過程卻沒有把內(nèi)容鏈接進(jìn)去,而是在執(zhí)行過程中,再去找要鏈接的內(nèi)容,生成可執(zhí)行文件中并沒有要鏈接的內(nèi)容,所以當(dāng)你刪除動態(tài)庫時(shí),可執(zhí)行程序就不能運(yùn)行。
動態(tài)鏈接生成的可執(zhí)行文件要比靜態(tài)鏈接生成的文件要小一些。
多態(tài)?
可以簡單地概括為“一個接口,多種方法”。
多態(tài)的作用?
- 隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;
- 接口重用:為了類在繼承和派生的時(shí)候,保證使用家族中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
靜態(tài)多態(tài)和動態(tài)多態(tài)?
靜態(tài)多態(tài):函數(shù)重載和運(yùn)算符重載屬于靜態(tài)多態(tài),復(fù)用函數(shù)名;
動態(tài)多態(tài):派生類和虛函數(shù)實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)。
區(qū)別:
- 靜態(tài)多態(tài)的函數(shù)地址早綁定,在編譯階段確定函數(shù)地址;
- 動態(tài)多態(tài)的函數(shù)地址晚綁定,運(yùn)行階段確定函數(shù)地址。
動態(tài)多態(tài)滿足條件: - 有繼承關(guān)系;
- 子類重寫父類的虛函數(shù)。
C++---靜態(tài)多態(tài)與動態(tài)多態(tài)