通俗易懂解释一下C++的构造函数是怎样的呢?
你買了套房,住進(jìn)去之前得先裝修。
你買個(gè)硬盤,用之前得先分區(qū)。
你買個(gè)手機(jī),用之前得先裝上sim卡、下載一些必要軟件、注冊(cè)/登錄微信/支付寶賬戶。
創(chuàng)建一個(gè)對(duì)象也一樣:你得到了一塊內(nèi)存;這塊內(nèi)存可能是“二手房”,前任留下的shit什么的都還留在里面,你得先清理(把內(nèi)容置零)、重新裝修(設(shè)置一些基礎(chǔ)信息)之后才能入住。
過(guò)去,C時(shí)代,這些都得你自己照應(yīng)。如果你忘了,那么訪問(wèn)了未初始化存儲(chǔ)區(qū)、讀出亂七八糟的東西,你就自認(rèn)倒霉吧。
C++時(shí)代,人們變聰明了:既然裝修是入住前的必要步驟,我干脆把它固定到你的《購(gòu)房流程指導(dǎo)書(shū)》里算了。你交錢買房后,就會(huì)有人領(lǐng)你看房、給你談裝修事宜。
這個(gè)固定的、執(zhí)行裝修事宜的步驟就是構(gòu)造函數(shù)。
用偽碼表示的話,對(duì)象創(chuàng)建流程是這樣的:
1、用各種奇怪的方式得到一塊內(nèi)存
2、執(zhí)行構(gòu)造函數(shù),“裝修”這塊內(nèi)存
3、拎包入住
每個(gè)人都有自己獨(dú)特的口味,每個(gè)用戶自定義對(duì)象也有不同的初始化流程。
因此,C++做了一個(gè)約定:和類名相同的無(wú)返回函數(shù)就是它的初始化函數(shù)(構(gòu)造函數(shù)),編譯器保證在創(chuàng)建一個(gè)對(duì)象之后、允許你使用它之前,它必定會(huì)在這個(gè)對(duì)象對(duì)應(yīng)的內(nèi)存上執(zhí)行構(gòu)造函數(shù),按你的要求把對(duì)象裝修好。如果你不寫(xiě),那么它默認(rèn)給你個(gè)毛坯房(這就是所謂的“默認(rèn)構(gòu)造函數(shù)”)。
舉例來(lái)說(shuō),你打算寫(xiě)個(gè)網(wǎng)游;其中有一個(gè)魔法師角色;那么當(dāng)new一個(gè)新的魔法師對(duì)象時(shí),你就要給它弄上一套默認(rèn)的初始裝備:
現(xiàn)在,你聲明一個(gè)法師對(duì)象,對(duì)應(yīng)的構(gòu)造函數(shù)就被調(diào)用了:
//自動(dòng)執(zhí)行Mage(),為它添加一根白板法杖和一件普通法袍 Mage babyMage(); //自動(dòng)執(zhí)行Mage(法杖類型 法杖, 法袍類型 法袍),給它一套NB的裝備 Mage superMage(天使之杖, 神圣裹尸布);一般來(lái)說(shuō),你寫(xiě)了自己的構(gòu)造函數(shù),就有必要寫(xiě)出自己的析構(gòu)函數(shù)。這樣刪除法師對(duì)象時(shí),可以把new給他的裝備一起刪掉,以免造成內(nèi)存泄漏:
class Mage {Mage() {//new一個(gè)白板法杖//new一件普通法袍}Mage(法杖類型 法杖, 法袍類型 法袍) {//按傳入的法杖類型new一根法杖//按傳入的法袍類型new一件法袍}~Mage() {//刪除法杖、法袍等對(duì)象} }C++保證在你調(diào)用delete時(shí),先自動(dòng)調(diào)用析構(gòu)函數(shù)(而我們安排在這個(gè)函數(shù)里面刪除它的法杖、法袍等對(duì)象),再刪除對(duì)象占用的內(nèi)存。
以上,就是所謂的RAII機(jī)制(Resource Acquisition Is Initialization)。
C++中的RAII機(jī)制
等你有了一定的開(kāi)發(fā)經(jīng)驗(yàn),那么一定經(jīng)常聽(tīng)到“(資源)誰(shuí)申請(qǐng)誰(shuí)釋放”原則。基于這個(gè)原則才能清晰、準(zhǔn)確的界定資源的生存期、控制權(quán)。
而RAII天然保證了這個(gè)原則被嚴(yán)格執(zhí)行:如果任何類/對(duì)象都嚴(yán)格的管好自己申請(qǐng)的資源、并在析構(gòu)時(shí)確保這些資源被無(wú)遺漏的歸還;那么對(duì)一個(gè)熟練掌握了RAII的程序員來(lái)說(shuō),只要一個(gè)對(duì)象的生存期、所有權(quán)、引用關(guān)系(計(jì)數(shù))在設(shè)計(jì)之初都理清楚了,資源泄露就是不可能的。
為了清晰表達(dá)“所有權(quán)轉(zhuǎn)移、復(fù)制”等相關(guān)語(yǔ)義,C++標(biāo)準(zhǔn)庫(kù)才提供了shared_ptr、unique_ptr、weak_ptr等“智能指針”;更有趣的是,這些“智能指針”同樣是借助于有保障的構(gòu)造/析構(gòu)函數(shù)的自動(dòng)調(diào)用機(jī)制設(shè)計(jì)的。你必須先透徹理解構(gòu)造/析構(gòu)函數(shù),才有可能明白它們的工作原理、甚至自己實(shí)現(xiàn)它們(沒(méi)錯(cuò),過(guò)去那個(gè)C++標(biāo)準(zhǔn)化/STL庫(kù)總是跟不上趟的年代里,很多程序員在自己的工程里手工編寫(xiě)過(guò)shared_ptr)。
Smart pointers (Modern C++)
因此,當(dāng)其它語(yǔ)言的程序員覺(jué)得離開(kāi)“垃圾回收”都活不成時(shí),資深C++程序員輕蔑的說(shuō)“資源可不僅僅是內(nèi)存”——沒(méi)有嚴(yán)格的RAII機(jī)制,沒(méi)有構(gòu)造/析構(gòu)函數(shù)調(diào)用時(shí)機(jī)的可靠保證,其它語(yǔ)言在管理內(nèi)存之外的資源時(shí),反而要比C++困難。
總結(jié)
以上是生活随笔為你收集整理的通俗易懂解释一下C++的构造函数是怎样的呢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++ 交换变量实践
- 下一篇: C++中的RAII机制