類的大小與對象模型
有兩個(gè)概念可以解釋C++對象模型:
1.語言中直接支持面向?qū)ο蟪绦蛟O(shè)計(jì)的部分涣觉。
2.對于各種支持的底層實(shí)現(xiàn)機(jī)制血柳。
語言中直接支持面向?qū)ο蟪绦蛟O(shè)計(jì)的部分,如構(gòu)造函數(shù)难捌、析構(gòu)函數(shù)、虛函數(shù)根吁、繼承(單繼承、多繼承击敌、虛繼承)、多態(tài)等等沃斤,這也是組里其他同學(xué)之前分享過的內(nèi)容。第一部分這里我簡單過一下衡瓶,重點(diǎn)在底層實(shí)現(xiàn)機(jī)制。
在c語言中关面,“數(shù)據(jù)”和“處理數(shù)據(jù)的操作(函數(shù))”是分開來聲明的坦袍,也就是說缭裆,語言本身并沒有支持“數(shù)據(jù)和函數(shù)”之間的關(guān)聯(lián)性。在c++中澈驼,通過抽象數(shù)據(jù)類型(abstract data type,ADT)缝其,在類中定義數(shù)據(jù)和函數(shù),來實(shí)現(xiàn)數(shù)據(jù)和函數(shù)直接的綁定内边。
概括來說,在C++類中有兩種成員數(shù)據(jù):static漠其、nonstatic;三種成員函數(shù):static和屎、nonstatic、virtual柴信。
C++對象模型
1.每一個(gè)class產(chǎn)生一堆指向虛函數(shù)的指針,放在表格之中询件。這個(gè)表格稱之為虛函數(shù)表(virtual table,vtbl)宛琅。
2.每一個(gè)對象被添加了一個(gè)指針,指向相關(guān)的虛函數(shù)表vtbl嘿辟。通常這個(gè)指針被稱為vptr片效。vptr的設(shè)定(setting)和重置(resetting)都由每一個(gè)class的構(gòu)造函數(shù)英古,析構(gòu)函數(shù)和拷貝賦值運(yùn)算符自動(dòng)完成淀衣。
C++中一些重要的語法糖
靜態(tài)常量整數(shù)成員(double就不行)在class內(nèi)部直接初始化
靜態(tài)成員只能在類外初始化召调,且初始化時(shí)不加static
基類夠構(gòu)造函數(shù)中調(diào)用virtual函數(shù)實(shí)際調(diào)用的是基類中的virtual函數(shù)(這點(diǎn)和Java不同)
const成員函數(shù):不修改類成員數(shù)據(jù)