成員變數 函式指標的用法zz

2021-09-05 13:56:25 字數 1535 閱讀 1250

說明:

這是今天看《thinking in c++》的第10章時作的"筆記",前面也有人

問到關於成員函式指標的問題,我那時說直接傳入this指標,現在看

了書後有多了一種方法,不過,它的語法有點難計。

這下回去可以看看mfc的訊息對映/動態建立是怎麼寫的了,我想也應

該是成員函式指標把

指標是指向一些記憶體位址的變數,既可以是資料的位址也可以是函式的位址。c++的

成員指標遵從同樣的原則。困難的是所有的指標需要乙個位址,但在類內部沒有地

址;選擇乙個類的成員意味著在類中偏移。只有把這個偏移和具體物件的開始位址

結合,才能得到實際位址。成員指標的語法要求選擇乙個物件的同時逆向引用成員

指標。

struct ******

******  so;

******* sp = &so;

如果有乙個這個結構的指標sp和物件so,如果有乙個指標指向乙個類物件成員,甚至

假設它代表物件內一定的偏移,將會發生什麼?為了取得指標指向的內容,必須用*號逆向引用。但是,它只是乙個物件內的偏移,所以還必須要指定那個物件。因此,*號要和逆向引用的物件結合。

sp->*pm = 47; so.*pm = 47;

定義pm的語法是什麼?其實它像任何乙個指標,必須說出它指向什麼型別。並且,在定義中也要使用乙個『*』號。唯一的區別只是必須說出這個成員指標使用什麼類的物件。當然,這是用類名和全域性操作符實現的:

定義成員指標:

int ******::*pm;

定義並初始化成員指標:

int ******::*pm = &******::a;

因為引用到乙個類而非那個類的物件,因而,&******::a僅可作為成員指標的語法表示。

指向函式的指標定義像下面的形式:int(*fp)(float); (*fp)的圓括號用來迫使編譯器

正確判斷定義。沒有圓括號,這個表示式就是乙個返回int*值的函式。為了定義和使用乙個成員函式的指標,圓括號扮演同樣重要的角色。假設在乙個結構內有乙個函式:

struct ******2 ;

通過給普通函式插入類名和全域性操作符就可以定義乙個指向成員函式的指標:

int(******2::*fp)(float);

使用:

******2 s2;

int i = (s2.*fp)(1.5);

另乙個使用例子

class cb

int f2()

int (cb::*fptr[2])();

public:

cb()

int sel(int i)

}; 在建構函式中,成員指標的初始化似乎被過分地指定了。是否可以這樣寫:

fptr[1] = f2; 因為名字f2在成員函式中出現,是否可以自動地認為在這個類範圍內呢?問題是這不符合成員函式的語法,語法要求編譯器能夠判斷將要進行什麼。當成員函式被逆向引用時,它仍被過分地指定了,this似乎多餘。正如前面所講的,當它被逆向引用時,語法也需要成員指標總是和乙個物件繫結在一起。

c 函式指標 成員變數

類 b中以函式指標動態設定執行函式fun,執行函式fun內部會呼叫成員變數a a 是類a的例項 的方法 include include class a void disp class b void setfun char name else if 0 strcmp name,disp void sh...

類成員函式指標的用法

最近在寫關於控制項的東西,所以用到一些事件響應方面的處理。以前的用法都是函式指標的形式 如下 typedef void funcbtclick void pvalue 把pvalue 當做當前類的指標傳遞歸乙個類外面的函式,而在類外面寫函式,對於封裝來講就感覺很唐突,也很難管理。簡單研究了一些文章,...

zz 將成員函式指標強制轉換成void指標

採用取成員函式指標的位址的方法,先把指向成員函式指標的指標強制轉化為別的型別,如unsigned 當然同樣可以通過此轉化後的指標經過相反的變換來呼叫成員函式。於是乎要轉化為void 的問題也隨之可解,如下示例 vs2003下編譯執行 class abstractmethod public virtu...