doubango類物件導向研究

2022-08-18 21:03:13 字數 1777 閱讀 8911

本來對物件導向理解就不深,拿到doubango的**,感覺無從看起。

挑個通用的物件導向的實現的**部分,來**一下。比如,建立sip message的訊息時,會呼叫tsip_message_create()函式,函式內容如下:

tsip_message_t*tsip_message_create()

**裡面有兩個重要部分,

1. tsip_message_def_t 是乙個由sip模組自己定義的tsk_object_def_s物件。tsk_object_def_s是物件的統一的資料格式,裡面必須有物件size,建構函式和析構函式:

typedef struct

tsk_object_def_s

tsk_object_def_t;

這其中sip自己定義的message物件為:

static

const tsk_object_def_t tsip_message_def_s =;

const tsk_object_def_t *tsip_message_def_t = &tsip_message_def_s;

2. 上面可以看出tsip_message_def_t是乙個擁有建構函式和析構函式的物件,被傳進tsk_object_new函式,這個函式的作用就是根據tsip_message_def_t來分配一塊記憶體區域,並進行初始化。現在看一下tsk_object_new的具體內容:

tsk_object_t* tsk_object_new(const tsk_object_def_t *objdef, ...)

#if tsk_debug_objectstsk_debug_info(

"n∞ objects:%d

", ++tsk_objects_count);

#endif

}

else

}else

return

newobj;

}

a. **第一行提示不用對objdef的防護。

b. **第二行根據之前傳入的sip物件中的size來分配記憶體。

c. **第四行比較難理解。可以這樣考慮,首先不要去想newobj是指向分配好的記憶體區域的指標,而是將它看作乙個普通的void 指標。那麼(const tsk_object_def_t **) newobj就會將newobj強制型別轉換為乙個tsk_object_def_t的指標,這個指標指向了乙個tsk_object_def_t的指標。所以解引用newobj就寫成*(const tsk_object_def_t **) newobj,它的結果就是tsk_object_def_t的指標。最後,將此指標指向objdef。

如下圖所示,newobj為分配好的記憶體空間,經過(const tsk_object_def_t **) newobj轉換之後,newobj的前4個位元組,就變成了乙個指向指標的指標,這個指標儲存的內容是乙個位址,這個位址後來被設定為objdef的位址,**也就是地四行的(*(const tsk_object_def_t **) newobj) = objdef;

d. 第五行tsk_object_header(newobj)->refcount將newobj的下乙個位置設定為refcount,即引用計數,並初始化為1.

e. 第六行到十五行判斷是否在物件中有預設建構函式,例如我們的sip message中建構函式為tsip_message_ctor,這個建構函式接受newobj引數,並將其初始化。

物件導向類

1.類和例項 類是抽象的模板,比如student類,而例項是根據類建立出來的乙個個具體的 物件 每個物件都擁有相同的方法,但各自的資料可能不同。記憶體位址 給例項繫結屬性 由於類可以起到模板的作用,因此,可以在建立例項的時候,把一些我們認為必須繫結的屬性強制填寫進去 2.資料封裝 就是在類裡面定義方...

物件導向類

類的宣告 functiona es6 class a2 生成例項 newa newa2 如何繼承 借助建構函式繼承 functionp p.prototype.say function 父類的原型物件無法被子類繼承 functionc 借助原型鏈繼承 functionp functionc c.pr...

物件導向類

類與例項 1 類的宣告 1 第一種方式 用建構函式模擬類的方式 function animal 2 第二種方式 es6 class class animal2 2 生成例項 new animal new animal2 類與繼承 如何實現繼承 1 借助建構函式實現繼承 function parent...