回覆列表
  • 1 # IT劉小虎

    其實,“面向過程”和“面向物件”只是程式開發中的一種方法,或者說一種思想,大多數現代高階程式語言都能使用這兩種程式設計思想,C語言當然也不例外。

    只不過,有些程式語言在語法上支援“物件”,而C語言則沒有原生的“物件”語法。不過藉助於靈活的指標和結構體語法,在C語言程式開發中使用“面向物件”思想也是很簡單的。

    如果題主看過我之前文章的話,應該明白C語言程式每呼叫一次函式,系統就會在棧中分配一塊棧幀給被呼叫函式,當函式執行完畢後,這部分棧幀就自動被系統收回了。

    malloc() 函式的作用是申請一塊指定大小的記憶體,它的C語言原型如下,成功時返回這塊記憶體的首地址,失敗時返回 NULL。

    C語言程式中函式的區域性變數佔用的記憶體,是函式執行時,自動在其所屬棧幀中分配的,所以區域性變數會隨著函式結束釋放。不過,malloc() 向系統申請的記憶體在堆區裡,這部分記憶體不會隨著函式的退出自動釋放,需要程式設計師自己使用 free() 函式釋放:

    以上這幾行C語言程式碼的意思是向系統申請 5 位元組的記憶體,如果申請成功,就把它釋放。

    如果在C語言程式退出之前,只 malloc() 而不 free(),程式佔用的記憶體會越來越多,直到最後崩潰退出。這種情況,程式設計師習慣稱為“記憶體洩漏”。

    使用C語言進行“面向物件”程式設計

    相當一部分程式設計師看不起C語言是因為他們覺得C語言沒有“物件”。現在,我們嘗試給C語言找一個“物件”。請看:

    因為C語言不支援原生的“類”語法,所以我們使用結構體模擬了一個 class,定義了一個“FATHER 類”,它有成員函式 hello()。

    上述C語言程式碼又定義了一個“SON 類”,它有成員函式 hello(),也有成員變數 count(),還有一個“父類”father。接下來,定義“FATHER類”和“SON類”的 hello 函式,相關C語言程式碼如下:

    如何讓這兩個函式與我們定義的“類”產生聯絡呢?我們定義“建構函式”:

    上述C語言程式碼首先使用 malloc() 為 son 在堆中申請一塊記憶體,這保證了 son 在程式結束之前都不會被釋放。同樣的,為 father 也申請了一塊記憶體。

    接著,把它們各自的函式傳遞給結構體裡面定義的函式指標,這樣便定義好了“類”son。有了建構函式,再來定義“解構函式”,相關C語言程式碼如下:

    解構函式的主要作用就是釋放 malloc() 的記憶體,防止記憶體洩漏。至此,我們就使用C語言實現了“類”的封裝,測試一下:

    上述C語言程式碼是典型的“面向物件”風格:程式使用 SON 類例項化了一個 son 物件,son 呼叫了自己的成員函式,也呼叫了從“父類”繼承而來的函式。編譯並執行這段C語言程式碼,發現輸出與預期一致。

    應該注意的是,從表示式 son->hello(son) 可以看出,C語言沒有類的支援,所以需要顯式的把 son 指標傳給 hello。但是,“father類”和“son類”裡都可以使用 hello 做函式名,這說明C語言的“類”也對封裝有很好的效果。

  • 2 # TonyDeng

    可以在一定程度上模擬,但不完全,比如不能繼承。在封裝上可以的,不過在大多數情況下,面向物件主要也是用封裝的居多。

  • 3 # silver0916

    可以。面向物件是設計思想,語言本身不存在面向過程和麵向物件,只是說c++的多型、繼承等特性更容易實現面向物件的設計思想。

  • 4 # 叢雷123456

    完全可以。準確的說,C語言是被設計成面向過程的語言。但不影響你用什麼思想來運用它。就像高跟鞋最初是被設計成男人穿的鞋,但不影響女人穿它一樣!

  • 5 # 工程師小勤

    C是面向過程的,在語言這一層面上並沒有支援類和物件的概念,C++才支援的。但是,面向物件,本質上是一種程式設計和設計的思想。即使用純C,仍然不妨礙人應用面向物件的程式設計思想。倘若研究過Linux的原始碼就應該有點印象,它是純C寫的,但是裡面很多函式指標,本質上是模組之間互相松耦合,體現的就是面向物件的設計思想。

  • 6 # icecubi

    c語言最多隻能模擬一個類似,類的東西只有不完整的形,沒有最重要的神,正真類的繼承,派生等特效能是怎麼也無法模擬的。

  • 7 # 素食的貓

    沒class語句,可以用struct語句定義個類,然後用指向函式的指標方式定義類成員函式。

    但是玩繼承、多型、過載、公共私有等方面就不行了。

  • 中秋節和大豐收的關聯?
  • 為什麼信用額度跟固定額度不同?