[GeekBand] C++面向?qū)ο蟾呒壘幊?1

轉(zhuǎn)換函數(shù)(conversion function)

將本類的對象轉(zhuǎn)換為其他類型,其形式如下:

? ? ? ?operator typeName( ) { ?... ?}

轉(zhuǎn)換函數(shù)不能指定函數(shù)類型,函數(shù)沒有參數(shù)。轉(zhuǎn)換函數(shù)是隱式調(diào)用的,表達(dá)式中的對象需要進(jìn)行轉(zhuǎn)換時(shí),轉(zhuǎn)換函數(shù)將被自動(dòng)調(diào)用。


非顯式單參數(shù)構(gòu)造函數(shù)(non-explicit-one-argument constructor)

將其他類型的對象轉(zhuǎn)換為本類,這種函數(shù)也是的寫法和普通構(gòu)造函數(shù)類似,可以有多個(gè)參數(shù),但實(shí)際傳入的參數(shù)可以只有1個(gè)(其他參數(shù)有默認(rèn)值),在必要的時(shí)候能自動(dòng)調(diào)用此構(gòu)造函數(shù),將傳入?yún)?shù)的類型轉(zhuǎn)換為這個(gè)類類型。

顯式單參數(shù)構(gòu)造函數(shù)(explicit-one-argument constructor)

為了避免上述構(gòu)造函數(shù)的隱式調(diào)用,可以將其聲明為顯式單參數(shù)構(gòu)造函數(shù)。

像指針的類或指針類(pointer-like classes)

是指一個(gè)類被設(shè)計(jì)成像指針一樣,通過重載 operator * 和 operator ->, 此類的對象具有與指針相同的使用形式。指針類主要有智能指針和迭代器兩種形式。

智能指針示例如下:

Shared_ptr 示例

上述示例中,new Foo 構(gòu)造了一個(gè)Foo類的對象,以此對象為參數(shù)構(gòu)造了指針類的對象sp,因此sp能像指針一樣使用。shared_ptr中重載了操作符*與操作符->,其中前者返回T類型的對象*px,后者返回T類型的指針px。使用shared_ptr。使用(*sp)可以取得sp所指向的Foo類對象,使用sp->method()可以調(diào)用sp所指向的Foo類對象的函數(shù)method。

迭代器示例如下:

迭代器構(gòu)造示例

迭代器使用示例

迭代器與智能指針一樣需要重載 operator* 與 operator->,構(gòu)造的迭代器的對象可以像指針一樣使用 * 與 -> 操作符。另外迭代器中有重載 operator++ 與 operator--,因此使用迭代器可以遍歷容器中的所有元素。


像函數(shù)的類(function-like classes)

像函數(shù)的類即函數(shù)對象(function object)或仿函數(shù)(functor),仿函數(shù)被設(shè)計(jì)成一種可以像使用一個(gè)函數(shù)一樣的類,仿函數(shù)這種類中必須重載 operator( )。一個(gè)普通的函數(shù)是函數(shù)對象,一個(gè)函數(shù)指針當(dāng)然也是,廣義上說任何定義了operator()的類對象都可以看作是函數(shù)對象。

參考見Aegeaner的專欄:http://blog.csdn.net/aegeaner/article/details/7482606


仿函數(shù)相對于普通函數(shù)具有如下優(yōu)勢:

1、仿函數(shù)是“smart functions”(智能型函數(shù)):仿函數(shù)可以擁有成員函數(shù)和成員變量,即仿函數(shù)擁有狀態(tài);

2、每個(gè)仿函數(shù)都有自己的型別:可以將仿函數(shù)的型別當(dāng)做template參數(shù)來傳遞,從而指定某種行為模式;

3、仿函數(shù)通常比一般函數(shù)速度快:就template概念而言,由于更多細(xì)節(jié)在編譯期間就已確定,所以通??赡苓M(jìn)行更好的最佳化。

參考見極限游樂園:http://www.cnblogs.com/lverson/p/3164037.html

成員模板(member template

任意類(模板或非模板)可以擁有本身為類模板或函數(shù)模板的成員,這種成員稱為成員函數(shù)模板。成員模板可以定義在類的內(nèi)部,也可以在類的外部定義。如果在類外部定義必須先后包含類模板形參表、成員模板形參表。

模板特化(sapecialization)與偏特化(partial specialization)

模板(template)分為類模板、函數(shù)模板與成員模板,函數(shù)模板與類模板可以進(jìn)行全特化,另外類模板還可以進(jìn)行偏特化(partial specialization),偏特化就是模板中的參數(shù)沒有全部確定,需要編譯器在編譯時(shí)確定,包括個(gè)數(shù)的偏與范圍的偏。個(gè)數(shù)上的偏,即指定了部分模板參數(shù),范圍上的偏,即將原有的類型參數(shù) T 加上 const、指針、引用等修飾變成 T*, const T*, T&, const T&, 或者將其包裝為其他類型如 vector<T>。

對象模型(Object Model)

C++對象的內(nèi)容分為數(shù)據(jù)成員(class data members)與成員函數(shù)(class member functions),其中數(shù)據(jù)成員又可分為靜態(tài)數(shù)據(jù)成員、非靜態(tài)數(shù)據(jù)成員兩類,成員函數(shù)又可分為靜態(tài)函數(shù)、非靜態(tài)函數(shù)與虛函數(shù)三類。

存在虛函數(shù)的類對象里連續(xù)存放著虛函數(shù)表指針(Vptr)與靜態(tài)數(shù)據(jù)成員,Vptr 指向虛函數(shù)表(Vtbl),Vtbl 存放于其他區(qū)域,而Vtbl里連續(xù)存放著此類對象的所有虛函數(shù)的地址。

class Base { ?

private:

? ?int i;

? ?double d;

public:

? ?virtual f( ) { ? ?}

? ?virtual g( ) { ? ?}

};

可以通過如下代碼驗(yàn)證虛函數(shù)的相關(guān)機(jī)制:

typedef void(*Fun)(void);

Base b;

虛函數(shù)表指針(Vptr)的地址:(int*)(&b);

虛函數(shù)表(Vtbl)的地址:*((int*)(&b)) ;

第一個(gè)虛函數(shù) f( ) 的地址:(int*)*(int*)(&b) + 0,或:(int*)(*(int*)(&b)) + 0; ? ?

第二個(gè)虛函數(shù) g( ) 的地址: (int*)*(int*)(&b) + 1,或:(int*)(*(int*)(&b)) + 1;

將第一個(gè)虛函數(shù)的地址轉(zhuǎn)化為Fun類型的函數(shù)指針:(Fun)*((int*)*(int*)(&b) + 0)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容