指向成員函式的指標
取乙個非靜態成員函式的位址,如果該函式是nonvirtual,則得到的結果是它在記憶體中真正的位址。然而這個值也不是完全的,它也需要被繫結於某個class object的位址上,才能夠通過它呼叫該函式。所有的非靜態成員函式都需要物件的位址(以引數this指出)。
乙個指向成員函式的指標,其宣告語法如下所示:
double //return type
(point::* //class the function is member
pmf) // name of pointer to member
(); // argument list
然後我們可以這樣定義並初始化該指標:
double (point::*coord)() = &point::x;
也可以這樣指定其值:
coord = &point::y;
想呼叫它,可以這樣做:
(origin.*coord)();或 (ptr->*coord)();
指向member function的指標的宣告語法,以及指向「member selection運算子」的指標,其作用是作為this指標的空間保留者。這也就是為什麼static member functions(沒有this指標)的型別為「函式指標」,而不是「指向member function之指標」的原因。使用乙個成員函式的指標,如果並不用於虛函式、多重繼承、虛基類等情況的話,並不會比使用乙個「nonmember function 指標」的成本更高。
支援「指向virtual member functions」的指標
注意下面的程式片段:
float (point::*pmf)() = &point::z;
point *ptr = new point3d;
pmf,乙個指向成員函式的指標,被設定為point::z()(乙個虛函式)的位址。如果我們直接經由ptr呼叫z():
ptr->z();
則被呼叫的是point3d::z()。但如果我們從pmf間接呼叫z()呢?
(ptr->*pmf)();
仍然是point::z()被呼叫嗎?也就是說,虛擬機制仍然能夠在使用「指向成員函式的指標」的情況下正常執行嗎?如何實現的呢?
class point{
public:
virtual ~point();
float x();
float y();
virtual float z();
&point::~point;
&point::x();
&point::y();
&point::z();
得到的結果是2,通過pmf來呼叫z(),會被內部轉化為乙個編譯時期的式子,一般形式如下:
( *ptr->vptr[(int)pmf] )( ptr );
對乙個指向成員函式的指標評估求值,會因為該值有兩種意義而複雜化,其呼叫操作也將有別於常規呼叫操作。pmf的內部定義,也就是:
float (point::*pmf)();
必須允許該函式能夠定址出nonvirtual x()和virtual z()兩個成員函式,這兩個成員函式有著相同的原型,只不過其中乙個代表記憶體位址,另外乙個代表在對應虛表中的索引值。因此,編譯器必須定義pmf使它能夠(1)含有兩種數值,(2)更重要的是其數值可以被區別代表記憶體位址還是虛表中的索引值。
在cfront2.0的非正式版本中,這兩個值被內含在乙個普通的指標內。它使用如下技巧:
(((int)pmf) & ~127)
? (*pmf)(ptr) //non-virtual invocation
: ( *ptr->vptr[(int)pmf] )( ptr ); //virtual invocation
這種實現技巧必須假設繼承體系中最多隻能夠有128個虛函式。這並不是我們所希望的,但卻證明是可行的。
指向成員函式的指標
c 中,成員指標是最為複雜的語法結構。但在事件驅動和多執行緒應用中被廣泛用於呼叫回叫函式。在多執行緒應用中,每個執行緒都通過指向成員函式的指標來呼叫該函式。在這樣的應用中,如果不用成員指標,程式設計是非常困難的。剛遇到這種語法時也許會讓你止步不前。但你會發現,使用恰當的型別定義之後,複雜的語法是可以...
函式指標 指向 類成員
在程式設計工作中常會遇到在乙個 類 中通過函式指標呼叫成員函式的要求,如,當在乙個類中使用了c 標準庫中的排序函式qsort時,因qsort引數需要乙個 比較函式 指標,如果這個 類 使用某個成員函式作 比較函式 就需要將這個成員函式的指標傳給qsort供其呼叫。本文所討論的用指標呼叫 類 的成員函...
指向public成員函式的指標
c 中,所謂普通成員函式,無非就是比普通函式在形參列表的最後,多了乙個這個型別的this指標,本質上和一般的函式沒有什麼不同。而類的靜態成員函式,則和普通函式完全一樣。所以宣告函式指標時,對於類的靜態成員函式,方法和普通函式指標是一樣的。對於普通成員函式,則有一點區別。受this指標的影響,類的非靜...