)
嚴格來說C語言是一門面向過程的語言它本身并沒有像 C 或 Java 那樣原生支持 class類的關(guān)鍵字和面向?qū)ο髾C制。不過C語言提供了非常強大的結(jié)構(gòu)體struct。在實際開發(fā)中程序員通常會利用 struct 配合函數(shù)指針來“模擬”出類的核心特性封裝、多態(tài)等。以下是 C語言中“模擬類”的核心方式1. 用 struct 模擬“屬性”與“方法”在 C 中類的成員變量和成員函數(shù)是一體的。而在 C 語言中通常將數(shù)據(jù)放在 struct 中將操作這些數(shù)據(jù)的函數(shù)寫在外部并將 struct 的指針作為參數(shù)傳遞給函數(shù)模擬 this 指針。#include // 1. 定義“類”的屬性結(jié)構(gòu)體 typedef struct { char *name; int age; } Person; // 2. 定義“方法”普通函數(shù)傳入結(jié)構(gòu)體指針模擬 this void person_say_hello(Person *this) { printf(Hello, my name is %s, I am %d years old.\n, this-name, this-age); } // 3. 模擬“構(gòu)造器” Person create_person(const char *name, int age) { Person p; p.name (char *)name; p.age age; return p; } int main() { // 4. 實例化“對象”并調(diào)用“方法” Person p1 create_person(Alice, 25); person_say_hello(p1); return 0; }2. 用“函數(shù)指針”模擬“多態(tài)”如果想在 C 語言中實現(xiàn)類似類的“多態(tài)”不同對象調(diào)用同名方法產(chǎn)生不同行為可以在 struct 中嵌入函數(shù)指針typedef struct { void (*speak)(void); // 函數(shù)指針相當于虛函數(shù) } Animal; void dog_speak() { printf(Woof!\n); } void cat_speak() { printf(Meow!\n); } int main() { Animal dog { dog_speak }; Animal cat { cat_speak }; dog.speak(); // 輸出: Woof! cat.speak(); // 輸出: Meow! return 0; }3. C語言與 C 類的核心區(qū)別雖然 C 語言可以“模擬”類但它缺乏面向?qū)ο笳Z言的底層支持總結(jié)在 C 語言中你無法直接寫 class但可以通過 struct 函數(shù)指針 這套組合拳實現(xiàn)高度類似類的面向?qū)ο缶幊?。Linux 內(nèi)核中大量的面向?qū)ο笤O(shè)計如 VFS 虛擬文件系統(tǒng)就是基于這種 C 語言技巧實現(xiàn)的。