成員函式指標的定義:
一般形式
return_type (class_name::* pointer_name) (argument_list);
用typedef簡化的形式
typedef return_type (class_name::* funcptr_type) (argument_list);
funcptr_type pfunc = null;//pfunc為成員函式指標的指標變數
成員函式指標的呼叫
(obj.*pprint)(argument_list);//obj為類的物件
(pobj->*pprint)(argument_list);//pobj為類的物件的指標
舉個例子如下:
#include "stdafx.h"
#include
#include
using namespace std;
class person
void printpersoninfo()
};typedef void (person::*printfunc)();
printfunc pprint = &person::printpersoninfo;
void testmemberfuncptr()
結果:age: 2 weight: 15.2 height: 0.45
age: 22 weight: 60.2 height: 1.75
說明:1.在 (child.*pprint)和 (padult->*pprint)兩邊的括號是語法所強制要求的。
2.指向外部原函式(全域性函式)的指標和指向類成員函式的指標是有很大區別的,類成員函式指標必須指向被調函式的宿主物件。因此,除了要有成員指標外還要有合法物件或物件指標。
當然,還可以把成員函式指標pprint的定義放在person類中,這時指標pprint為person類的乙個成員。如下:
class person
void printpersoninfo() };
void testmemberfuncptr()
靜態成員函式的指標
靜態成員函式指標的定義與一般的全域性函式一樣:
return_type (pointer_name) (argument_list);
例如:class person
void printpersoninfo()
static void sleep()
};//非靜態成員函式的指標
typedef void (person::*printfunc)();
printfunc pprint = &person::printpersoninfo;
//靜態成員函式的指標
typedef void(*staticmemberfunctype)();
staticmemberfunctype psleep = &person::sleep;//可以為&person::sleep,也可以為
void testmemberfuncptr()
說明:乙個靜態成員函式沒有 this 指標。除了它和其它的類成員共享命名空間(類名,如此例中為person)之外,它和常規全域性函式是一樣的。所以,靜態成員函式不是類的一部分,成員函式指標的語法對靜態成員函式指標並不成立。
成員函式為虛函式
對於nonstatic member function (非靜態成員函式)取位址,獲得該函式在記憶體中的實際位址
對於virtual function(虛函式),其位址在編譯時期是未知的,所以對於virtual member function(虛成員函式)取其位址,所能獲得的只是乙個索引值。
例:#include "stdafx.h"
#include
#include
#include
using namespace std;
class person
virtual void eatfood(string foodname) = 0;
virtual void play()
void printpersoninfo()
static void sleep()
};class student : public person
virtual void eatfood(string foodname)
virtual void play()
void printpersoninfo()
};void testmemberfuncptr()
結果:person::printpersoninfo: 01181190
person::eatfood: 01181294
person::play: 011812e9
student::printpersoninfo: 01181398
student::eatfood: 01181294
student::play: 011812e9
playing games...
eating vegetable...
當成員函式是虛函式的時候,成員函式能夠具有多型性並且可用父類的成員函式指標呼叫子類的方法。「乙個指向虛成員的指標能在不同位址空間之間傳遞,只要二者使用的物件布局一樣」 (此話來自c++老爸 bjarne stroustrup 的 《c++程式語言》 )。 當函式是虛函式的時候,編譯器會生成虛函式表,來儲存虛函式的位址。這是和非虛函式之間的最大不同,因此,執行時的行為也是不同的。
類的成員函式指標
要想弄清楚類的函式成員指標,先得了解什麼是函式指標。例如 有乙個函式 int add int a,int b 你可以直接使用add 2,4 來呼叫該函式 當然,你也可以宣告乙個指向該函式的指標,再通過指標去呼叫函式 int padd int int add 函式名就代表位址,也可以用 add pad...
指向類資料成員 類成員函式的指標
成員指標是指可以指向類的非靜態成員的指標,一般情況下指標指向乙個物件,但是成員指標指示的是類的成員,而非類的物件,類的靜態成員不屬於任何物件,因此無須特殊的指向靜態成員的指標,指向靜態成員的指標與普通指標沒有什麼區別,成員指標的型別囊括了類的型別以及成員的型別,當初始化乙個這樣的指標時,我們令其指向...
類成員函式指標
類成員函式指標 類的成員函式分為兩種,一種是靜態函式,另外一種是非靜態函式。例如 class x display 為靜態函式,getvalue即為非靜態函式。兩種函式在使用的時候是不一樣的。靜態函式可以直接由類名來呼叫,而非靜態函式則必須通過某乙個物件來呼叫,例如 x display x x x.g...