对于类对象对于成员的调用,需要有类对象的限定,一方面是一个类命名空间,另一方面用于传递隐含的this指针。 数据和函数,包括类对象的数据成员和成员函数,都是可以寻址的,自然也可以定义一个指针,使其指向类成员或成员函数,然后通过指针来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。1指向普通变量和函数的指针变量 关于数据的指针变量存储了具有特定数据类型的一个内存空间的首地址,确定了其指向的目标对象的蓝图,核心是由数据类型确定了目标对象所需内存空间大小,数据类型的编码和解码方式。关于代码的指针变量是指指向函数的指针变量,同样是首地址,类型是由函数签名所确定的类型,以及代码的指令集编码及读取和译码方式。voidfunc(inta){coutpreh1classpgcharrowrightdatatrack62指向类数据成员和成员函数的指针h1pdatatrack19strong2。1指向类数据成员的指针strongpdatatrack202。1。1定义precode数据类型类名::指针名 为了区别于普通指针变量,多了一个类名作用域限定,也显示了与类及类成员的相关性。 2。1。2赋值初始化数据类型类名::指针名〔类名::非静态数据成员〕 指向非静态数据成员的指针在定义时必须和类相关联,在使用时必须和具体的对象关联。 2。1。3解引用 由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。类对象名。指向非静态数据成员的指针类对象指针指向非静态数据成员的指针 示例代码:Students1(zhangsan,1002);stringStudent::psStudent::数据成员指针couts1。数据成员指针解引用couts2。StudentppnewStudent(wangwu,1003); 2。2指向类成员函数的指针 定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致:参数列表要相同、返回类型要相同、所属的类型要相同。 2。2。1定义数据类型(类名::指针名)(参数列表) 为了区别于全局函数指针,多了一个类名作用域限定,也显示了与类及类成员的相关性。 2。2。2赋值初始化数据类型(类名::指针名)(参数列表)〔类名::非静态成员函数〕 2。2。3解引用 由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。(类对象名。指向非静态成员函数的指针)(参数列表)(类对象指针指向非静态成员函数的指针)(参数列表) 示例代码:classStudent{public:Student(stringn,intnu):name(n),num(nu){}voiddis(){}};intmain(){Students1(zhangsan,1002);Students2(lisi,1001);stringpss。stringStudent::psStudent::数据成员指针couts1。数据成员指针解引用couts2。StudentppnewStudent(wangwu,1003);void(Student::pf)()Student::成员函数指针(s1。pf)();使用成员函数指针(s2。pf)();(pppf)();getchar();return0;}3指向类静态成员的指针 指向非静态成员时,必须用类名作限定符,使用时则必须用类的实例作限定符。指向静态成员时,声明时则不需要使用类名作限定符。(当然静态成员做右值也需要类名限定)classA{public:staticvoidprint();};voidA::print(){}intA::data100;intmain(){intpA::右值要有类限定void(pfunc)()A::pfunc();getchar();return0;}4类成员函数指针数组 用指向类员函数的指针,可以实现更加隐蔽的接口。classWidget{public:Widget(){fptr〔0〕f;fptr〔1〕g;fptr〔2〕h;fptr〔3〕i;}voidselect(intidx,intval){if(idx0idxcnt)(thisfptr〔idx〕)(val);}intcount(){}private:voidf(intval){coutvoidf()}voidg(intval){coutvoidg()}voidh(intval){coutvoidh()}voidi(intval){coutvoidi()}enum{cnt4};void(Widget::fptr〔cnt〕)(int);};intmain(){Wfor(inti0;iw。count();i){w。select(i,1);}getchar();return0;}5类函数指针做函数参数 类函数指针与普通函数指针一样,也可以做函数参数,形成函数回调的效果,实现更加弹性和通用的代码。includestdio。hclassCS{public:voidcallback(intn){printf(处理逻辑1,d,n);}voidcallback2(intn){printf(处理逻辑2,d,n);}voidcallee(void(CS::csPF)(int))类成员函数指针{printf(按不同的处理逻辑操作);(thiscsPF)(12);调用成员函数指针与调用普通函数指针不同}voidcaller()callercallscalleethatcallscallback{callee(callback);}voidcaller2(){callee(callback2);}staticvoidsmfunc(intn){printf(我是一静态成员函数d,n);}friendvoiduserCSMemFunc(CScs,void(CS::csPF)(int));private:};voiduserCSMemFunc(CSpcs,void(CS::csPF)(int)){pcs。csi256;(pcs。csPF)(pcs。csi);}voiduserCSMemFunc2(CSpcs,void(CS::csPF)(int)){(pcs。csPF)(128);}intmain(){CScs,cs。caller();cs。caller2();typedefvoid(CS::csPF)(int);csPFcspfCS::(cs。cspf)(24);调用成员函数指针与调用普通函数指针不同(pcscspf)(48);void(pf)(int)cannotconvertfromvoid(thiscallCS::)(int)tovoid(cdecl)(int)void(pf)(int)CS::pf(256);userCSMemFunc(cs,CS::callback2);userCSMemFunc2(cs,CS::callback2);void(pff)(CScs,void(CS::csPF)(int))userCSMemFpff(cs,CS::callback2);getchar();return0;}按不同的处理逻辑操作处理逻辑1,12按不同的处理逻辑操作处理逻辑2,12处理逻辑1,24处理逻辑1,48我是一静态成员函数256处理逻辑2,256处理逻辑2,128处理逻辑2,256 https:blog。csdn。netyyx112358articledetails78515420 End