轉換函數(conversion function)
將本類的對象轉換為其他類型,其形式如下:
? ? ? ?operator typeName( ) { ?... ?}
轉換函數不能指定函數類型,函數沒有參數。轉換函數是隱式調用的,表達式中的對象需要進行轉換時,轉換函數將被自動調用。
非顯式單參數構造函數(non-explicit-one-argument constructor)
將其他類型的對象轉換為本類,這種函數也是的寫法和普通構造函數類似,可以有多個參數,但實際傳入的參數可以只有1個(其他參數有默認值),在必要的時候能自動調用此構造函數,將傳入參數的類型轉換為這個類類型。
顯式單參數構造函數(explicit-one-argument constructor)
為了避免上述構造函數的隱式調用,可以將其聲明為顯式單參數構造函數。
像指針的類或指針類(pointer-like classes)
是指一個類被設計成像指針一樣,通過重載 operator * 和 operator ->, 此類的對象具有與指針相同的使用形式。指針類主要有智能指針和迭代器兩種形式。
智能指針示例如下:
上述示例中,new Foo 構造了一個Foo類的對象,以此對象為參數構造了指針類的對象sp,因此sp能像指針一樣使用。shared_ptr中重載了操作符*與操作符->,其中前者返回T類型的對象*px,后者返回T類型的指針px。使用shared_ptr。使用(*sp)可以取得sp所指向的Foo類對象,使用sp->method()可以調用sp所指向的Foo類對象的函數method。
迭代器示例如下:
迭代器與智能指針一樣需要重載 operator* 與 operator->,構造的迭代器的對象可以像指針一樣使用 * 與 -> 操作符。另外迭代器中有重載 operator++ 與 operator--,因此使用迭代器可以遍歷容器中的所有元素。
像函數的類(function-like classes)
像函數的類即函數對象(function object)或仿函數(functor),仿函數被設計成一種可以像使用一個函數一樣的類,仿函數這種類中必須重載 operator( )。一個普通的函數是函數對象,一個函數指針當然也是,廣義上說任何定義了operator()的類對象都可以看作是函數對象。
參考見Aegeaner的專欄:http://blog.csdn.net/aegeaner/article/details/7482606
仿函數相對于普通函數具有如下優勢:
1、仿函數是“smart functions”(智能型函數):仿函數可以擁有成員函數和成員變量,即仿函數擁有狀態;
2、每個仿函數都有自己的型別:可以將仿函數的型別當做template參數來傳遞,從而指定某種行為模式;
3、仿函數通常比一般函數速度快:就template概念而言,由于更多細節在編譯期間就已確定,所以通常可能進行更好的最佳化。
參考見極限游樂園:http://www.cnblogs.com/lverson/p/3164037.html
成員模板(member template)
任意類(模板或非模板)可以擁有本身為類模板或函數模板的成員,這種成員稱為成員函數模板。成員模板可以定義在類的內部,也可以在類的外部定義。如果在類外部定義必須先后包含類模板形參表、成員模板形參表。
模板特化(sapecialization)與偏特化(partial specialization)
模板(template)分為類模板、函數模板與成員模板,函數模板與類模板可以進行全特化,另外類模板還可以進行偏特化(partial specialization),偏特化就是模板中的參數沒有全部確定,需要編譯器在編譯時確定,包括個數的偏與范圍的偏。個數上的偏,即指定了部分模板參數,范圍上的偏,即將原有的類型參數 T 加上 const、指針、引用等修飾變成 T*, const T*, T&, const T&, 或者將其包裝為其他類型如 vector<T>。
對象模型(Object Model)
C++對象的內容分為數據成員(class data members)與成員函數(class member functions),其中數據成員又可分為靜態數據成員、非靜態數據成員兩類,成員函數又可分為靜態函數、非靜態函數與虛函數三類。
存在虛函數的類對象里連續存放著虛函數表指針(Vptr)與靜態數據成員,Vptr 指向虛函數表(Vtbl),Vtbl 存放于其他區域,而Vtbl里連續存放著此類對象的所有虛函數的地址。
class Base { ?
private:
? ?int i;
? ?double d;
public:
? ?virtual f( ) { ? ?}
? ?virtual g( ) { ? ?}
};
可以通過如下代碼驗證虛函數的相關機制:
typedef void(*Fun)(void);
Base b;
虛函數表指針(Vptr)的地址:(int*)(&b);
虛函數表(Vtbl)的地址:*((int*)(&b)) ;
第一個虛函數 f( ) 的地址:(int*)*(int*)(&b) + 0,或:(int*)(*(int*)(&b)) + 0; ? ?
第二個虛函數 g( ) 的地址: (int*)*(int*)(&b) + 1,或:(int*)(*(int*)(&b)) + 1;
將第一個虛函數的地址轉化為Fun類型的函數指針:(Fun)*((int*)*(int*)(&b) + 0)。