大膽使用指向成員函式的指標
指向成員函式的指標是c++中比較複雜的語法結構,然而,它卻是事件驅動和多執行緒環境中不可缺少的,特別是當從外部呼叫成員函式的時候。在多執行緒裡,每乙個執行緒都通過指向成員函式的指標呼叫這一函式。如果c++沒有這些語法特性,那麼在很多情況下進行c++程式開發會遇到很多麻煩。
也許你開始會被這一性質的語法嚇倒,但當你熟悉之後你就會覺得它相當方便,並且可以通過使用typedef宣告來簡化。這一節裡我將講述如何宣告乙個指向成員函式的指標,賦乙個值給它,通過這一指標呼叫函式。
宣告乙個指向成員函式的指標
乙個指向成員函式的指標包括成員函式的返回型別,帶::符號的類名稱,函式引數表。雖然這一語法看似複雜,其實它和普通的指標是一樣的。指向外部函式的指標可如下宣告:
void (*pf)(char *, const char *);void strcpy(char * dest, const char * source);
pf=strcpy;
相應指向類a的成員函式的指標如下表示:
void (a::*pmf)(char *, const char *);以上pmf是指向類a的乙個成員函式的指標,傳遞兩個變數char *和 const char *,沒有返回值。注意星號前面的a::符號,這和前面的宣告是一致的。
賦值為了給乙個指向成員函式的指標賦值,可以採用成員函式名並再其前面加乙個&的方式,**範例可參見listing a。雖然一些舊的編譯器可以忽略&號,但在標準c++中是不允許的。
使用typedef
你可以使用typedef來隱藏一些指向成員函式的複雜指標。例如,下面的**定義了乙個類a中的成員函式的指標pma,並傳遞char *和const char *引數。
typedef void(a::*pma)(char *, const char *);這樣的陣列在選單驅動程式非常有用,如表clisting c所示。pma pmf= &a::strcat; // use a typedef to define a pointer to member
使用typedef特別有用,尤其是對於指向成員函式的陣列指標。
通過指標來呼叫成員函式
指向成員函式的指標可以呼叫物件的成員函式而無需知道這一函式的名稱。例如乙個傳送函式,它通過pmf來呼叫一函式,
這一函式與是否指向strcpy()或strcat()無關。這與傳統的指標呼叫外部方法是不一樣的。傳統的指標呼叫方法是這
樣的,你必須指定呼叫的成員函式所在的具體的物件。
為了能清楚說明這一點,讓我們來看乙個例子。假設你有兩個類a的物件,如listing b。指向成員函式的指標即有多型
性,這樣如果你通過這一指標來呼叫虛成員函式時,這一呼叫即是動態的。
高階使用方法
掌握了最基本的用法後,讓我們看看一些高階的用法:
指向成員函式的陣列指標pma pmf[2]=;
固定的成員函式
指向成員函式的型別包括成員函式的名稱,成員函式固定/不固定的性質。只要成員函式是可變的,pmf 會指向任一成員
函式。所以,如果你想把touppercase()的位址賦於pmf ,程式會發生錯誤,因為touppercase()是固定的,
listing d顯示了這一例子的**。
雖然有些編譯器能允許非固定指標指向乙個固定的成員函式,但在標準c++中是不允許的。
結論指向成員函式的指標實質上是包含多種資料成員的複雜資料結構。剛開始時你也許覺得它深不可測,但一旦你掌握並習慣
了這一語法,你會覺得這一方法在程式設計中是必不可少的,特別是在事件驅動和多執行緒設計中頻繁呼叫函式的時候。
指向成員函式的指標
指向成員函式的指標 取乙個非靜態成員函式的位址,如果該函式是nonvirtual,則得到的結果是它在記憶體中真正的位址。然而這個值也不是完全的,它也需要被繫結於某個class object的位址上,才能夠通過它呼叫該函式。所有的非靜態成員函式都需要物件的位址 以引數this指出 乙個指向成員函式的指...
指向成員函式的指標
c 中,成員指標是最為複雜的語法結構。但在事件驅動和多執行緒應用中被廣泛用於呼叫回叫函式。在多執行緒應用中,每個執行緒都通過指向成員函式的指標來呼叫該函式。在這樣的應用中,如果不用成員指標,程式設計是非常困難的。剛遇到這種語法時也許會讓你止步不前。但你會發現,使用恰當的型別定義之後,複雜的語法是可以...
函式指標 指向 類成員
在程式設計工作中常會遇到在乙個 類 中通過函式指標呼叫成員函式的要求,如,當在乙個類中使用了c 標準庫中的排序函式qsort時,因qsort引數需要乙個 比較函式 指標,如果這個 類 使用某個成員函式作 比較函式 就需要將這個成員函式的指標傳給qsort供其呼叫。本文所討論的用指標呼叫 類 的成員函...