探索 類的本質 嘗試用C實現乙個OC類

2021-06-28 16:47:28 字數 2308 閱讀 9645

嘗試總結

指向函式的指標

類的本質也是乙個物件,是class類的例項,簡稱「類物件」。

那麼,class類的本質又是什麼呢?

1# 官方給出的class型別的定義是這樣的:

typedef

struct objc_class *class

從這裡我們可以看出,class這個類的本質是乙個名叫objc_class的結構體。

2# 我們知道,乙個典型的類中包含兩部分內容:成員變數、方法,不難推測出,結構體中應該也包含這兩部分內容:

1. 由指向基本資料型別或其他結構體的指標構成的成員變數區

2. 由指向函式的指標所構成的方法區

ok,猜想完畢後,我們來嘗試做乙個擁有類的基本功能的結構體。

ps.類的基本功能:

1. 建立物件

2. 使用自定義的其他方法

當然這僅僅是最淺層次的模擬,不涉及到其他特性。

建立乙個car結構體,要求實現:

1. 擁有speed屬性

2. 提供乙個new函式,以該結構體為模板建立新結構體

3. 新結構體不能使用new函式

4. 新結構體可以使用run函式,並在螢幕上輸出「車子跑起來了」

經過一段時間的探索之後,得到了如下**,可以滿足上述需求。

//

// main.m

// 類的本質探索

//// created by azen.xu on 15/3/14.

///*

建立乙個car結構體,要求實現:

1. 擁有speed屬性

2. 提供乙個new函式,以該結構體為模板建立新結構體

3. 新結構體不能使用new函式

4. 新結構體可以使用run函式,並在螢幕上輸出「車子跑起來了」

*/#import

// 函式宣告

void run();

struct carb new(); //此例說明,結構體未定義以前,也可以宣告返回值為結構體的函式

// 定義結構體

// carb結構體用來存放物件方法指標;

struct carb;

// car結構體用來存放類方法指標

struct carcar = ; //在定義結構體的同時賦初值是因為,結構體必須在定義之後才會分配記憶體,才能呼叫方法。

// 主程式入口

int main()

// 函式實現

// new方法

struct carb new()

; // 此處一定要記得賦初值

return newcar;

}// run方法

void run()

通過這個例子,我們知道,採用結構體的方法可以實現與oc類相同的效果。

而乙個oc類需要兩個結構體來實現:

1. 結構體1用來存放類方法,其成員僅有「類方法」函式指標,且需要在宣告結構體的同時定義好結構體變數(這樣才能使類方法函式指標指向正確的函式)

2. 結構體2用來存放成員變數及物件方法

3. +new方法中,應當對生成的結構體初始化後(物件方法指標指向正確的函式)再返回

通過這個例子,對c語言知識進行了有效的複習:

1. 成員運算子「.」

2. 結構體的宣告、實現、初始化(定義及例項)

//#1

//標準宣告方式

struct 結構體名;

//標準實現方式

struct 結構體名 結構體變數名 = ;

//#2

//宣告同時實現並初始化

struct 結構體名結構體變數名 =

//#3

//匿名實現並初始化

struct結構體變數名 =

//#4

//typedef的應用

//宣告

typedef struct 結構體名結構體別名;

//實現

結構體別名 變數名 =

3. 結構體成員值的修改
//

#1箭頭

結構體變數名->成員名 = 值;

//#2成員運算子

結構體變數名.成員名 = 值;

1. 定義
返回值名 (*指標名)(引數列表);

2. 指函式
指標名 = 函式名;

3. 使用
指標名();

嘗試實現乙個簡單的threadpool

參考資料 c 高併發多執行緒學習 一 c 併發程式設計 part 2 標頭檔案 include include include include include include include include include using namespace std class task task vi...

C 實現乙個日期類

include using namespace std class date public bool is invalid date 判斷日期是否無效 return false public int day in month if is leap year return days month pub...

C 實現乙個Date類

關於日期類,我們最基本的成員變數就是三個 年 月 日。關於成員函式我們要實現構造,拷貝構造,賦值,關於日期的比較大小,以及日期加天數,日期減天數,以及 和 同時還要考慮能否復用,日期減日期,還有日期類的 和 分為前置和後置 等。具體 如下 詳情請看 注釋 date.h pragma once inc...