嘗試總結
指向函式的指標
類的本質也是乙個物件,是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...