指向成員函式的指標

2021-05-28 07:42:56 字數 2031 閱讀 8121

指向成員函式的指標

取乙個非靜態成員函式的位址,如果該函式是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指標的影響,類的非靜...