謝謝邀請。
其實(shí),“面向過程”和“面向?qū)ο蟆敝皇浅绦蜷_發(fā)中的一種方法,或者說一種思想,大多數(shù)現(xiàn)代高級編程語言都能使用這兩種編程思想,C語言當(dāng)然也不例外。
只不過,有些編程語言在語法上支持“對象”,而C語言則沒有原生的“對象”語法。不過借助于靈活的指針和結(jié)構(gòu)體語法,在C語言程序開發(fā)中使用“面向?qū)ο蟆彼枷胍彩呛芎唵蔚摹?/p>
malloc()和free()函數(shù)
鑒于題主可能是C語言初學(xué)者,在開始討論如何使用C語言進(jìn)行“面向?qū)ο蟆遍_發(fā)之前,先介紹兩個新函數(shù)——malloc()和free()。
如果題主看過我之前文章的話,應(yīng)該明白C語言程序每調(diào)用一次函數(shù),系統(tǒng)就會在棧中分配一塊棧幀給被調(diào)用函數(shù),當(dāng)函數(shù)執(zhí)行完畢后,這部分棧幀就自動被系統(tǒng)收回了。
malloc()函數(shù)的作用是申請一塊指定大小的內(nèi)存,它的C語言原型如下,成功時(shí)返回這塊內(nèi)存的首地址,失敗時(shí)返回NULL。
C語言程序中函數(shù)的局部變量占用的內(nèi)存,是函數(shù)運(yùn)行時(shí),自動在其所屬棧幀中分配的,所以局部變量會隨著函數(shù)結(jié)束釋放。
以上這幾行C語言代碼的意思是向系統(tǒng)申請5字節(jié)的內(nèi)存,如果申請成功,就把它釋放。
如果在C語言程序退出之前,只malloc()而不free(),程序占用的內(nèi)存會越來越多,直到最后崩潰退出。這種情況,程序員習(xí)慣稱為“內(nèi)存泄漏”。
使用C語言進(jìn)行“面向?qū)ο蟆本幊?/h3>
相當(dāng)一部分程序員看不起C語言是因?yàn)樗麄冇X得C語言沒有“對象”?,F(xiàn)在,我們嘗試給C語言找一個“對象”。請看:
因?yàn)镃語言不支持原生的“類”語法,所以我們使用結(jié)構(gòu)體模擬了一個class,定義了一個“FATHER類”,它有成員函數(shù)hello()。
上述C語言代碼又定義了一個“SON類”,它有成員函數(shù)hello(),也有成員變量count(),還有一個“父類”father。接下來,定義“FATHER類”和“SON類”的hello函數(shù),相關(guān)C語言代碼如下:
如何讓這兩個函數(shù)與我們定義的“類”產(chǎn)生聯(lián)系呢?我們定義“構(gòu)造函數(shù)”:
上述C語言代碼首先使用malloc()為son在堆中申請一塊內(nèi)存,這保證了son在程序結(jié)束之前都不會被釋放。同樣的,為father也申請了一塊內(nèi)存。
接著,把它們各自的函數(shù)傳遞給結(jié)構(gòu)體里面定義的函數(shù)指針,這樣便定義好了“類”son。有了構(gòu)造函數(shù),再來定義“析構(gòu)函數(shù)”,相關(guān)C語言代碼如下:
析構(gòu)函數(shù)的主要作用就是釋放malloc()的內(nèi)存,防止內(nèi)存泄漏。至此,我們就使用C語言實(shí)現(xiàn)了“類”的封裝,測試一下:
上述C語言代碼是典型的“面向?qū)ο蟆憋L(fēng)格:程序使用SON類實(shí)例化了一個son對象,son調(diào)用了自己的成員函數(shù),也調(diào)用了從“父類”繼承而來的函數(shù)。編譯并執(zhí)行這段C語言代碼,發(fā)現(xiàn)輸出與預(yù)期一致。
應(yīng)該注意的是,從表達(dá)式son->hello(son)可以看出,C語言沒有類的支持,所以需要顯式的把son指針傳給hello。但是,“father類”和“son類”里都可以使用hello做函數(shù)名,這說明C語言的“類”也對封裝有很好的效果。
歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。