指向类的成员函数的指针如何使用(详解)..doc

上传人:ni****g 文档编号:562060724 上传时间:2022-12-27 格式:DOC 页数:8 大小:256KB
返回 下载 相关 举报
指向类的成员函数的指针如何使用(详解)..doc_第1页
第1页 / 共8页
指向类的成员函数的指针如何使用(详解)..doc_第2页
第2页 / 共8页
指向类的成员函数的指针如何使用(详解)..doc_第3页
第3页 / 共8页
指向类的成员函数的指针如何使用(详解)..doc_第4页
第4页 / 共8页
指向类的成员函数的指针如何使用(详解)..doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《指向类的成员函数的指针如何使用(详解)..doc》由会员分享,可在线阅读,更多相关《指向类的成员函数的指针如何使用(详解)..doc(8页珍藏版)》请在金锄头文库上搜索。

1、我们第一复习一下指向函数的指针怎样使用?voidprint(void(*pfun(;/申明一个指向函数的指针,函数的参数是void,函数的返回值是voidpfun=print;/赋值一个指向函数的指针(*pfun(;/使用一个指向函数的指针比较简单,不是吗?为何*pfun需要用(扩起来呢?因为*的运算符优先级比(低,假如不用(就成了*(pfun(.指向类的成员函数的指针可是多了一个类的限制而已!classAvoidspeak(char*,constchar*;voidmain(Aa;void(A:*pmf(char*,constchar*;/指针的申明pmf=&A:speak;/指针的赋值一个

2、指向类A成员函数的指针申明为:void(A:*pmf(char*,constchar*;申明的解说是:pmf是一个指向A成员函数的指针,返回无种类值,函数带有二个参数,参数的种类分别是char*和constchar*。除了在星号前增添A:,与申明外面函数指针的方法同样。一种更为高妙的方法是使用种类定义:比如,下边的语句定义了无种类值,函数参数种类为PMA是一个指向A成员函数的指针,函数返回char*和constchar*:typedefvoid(A:*PMA(char*,constchar*;PMApmf=&A:strcat;/pmf是PMF种类(类A成员指针的变量下边请看对于类的使用的示例程

3、序!#includeusingnamespacestd;classPersonpublic:/*这里稍稍注意一下,我将speak(函数设置为一般的成员函数,而hello(函数设置为虚函数*/intvalue;voidspeak(coutIamaperson!endl;printf(%dn,&Person:speak;/*在这里考证一下,输出一下地点就知道了!*/virtualvoidhello(coutPersonsayHelloendl;Person(value=1;classBaizhantang:publicPersonpublic:voidspeak(coutIam白展堂!endl;v

4、irtualvoidhello(cout白展堂sayhello!endl;Baizhantang(value=2;typedefvoid(Person:*p(;/定义指向Person类无参数无返回值的成员函数的指针typedefvoid(Baizhantang:*q(;/定义指向Baizhantang类的无参数无返回值的指针intmain(Personpe;inti=1;pip;ip=&Person:speak;/ip指向Person类speak函数(pe.*ip(;/这个是正确的写法!/-/ result:IamaPerson!/ XXXXXXXXXX(表示一段地点/-/* 下边是几种错误的

5、写法,要注意!* pe.*ip(;* pe.(*ip(;* (pe.(*ip(;*/Baizhantangbzt;qiq=(void(Baizhantang:*(ip;/强迫变换(bzt.*iq(;/-/ result:IamaPerson!/ XXXXXXXXXX(表示一段地点/-/*有人可能会问了:ip明显被强迫变换成了Baizhantang类的成员函数的指针,为何输出结果仍是:* IamaPerson!在C+里面,类的非虚函数都是采纳静态绑定,也就是说类的非虚函数在编译前就已经* 确立了函数地点!ip以前就是指向Person:speak函数的地点,强迫变换以后,不过指针种类变了,里面*

6、的值并无改变,所以调用的仍是Person.speak函数,仔细的家伙会发现,输出的地点都是一致的.* 这里要重申一下:对于类的非静态成员函数,c+编译器会给每个函数的参数增添上一个该类的指针this,这也* 就是为何我们在非静态类成员函数里面能够使用this指针的原由,自然,这个过程你看不见!而对于静态成员* 函数,编译器不会增添这样一个this。*/iq=&Baizhantang:speak;/*iq指向了Baizhantang类的speak函数*/ip=(void(Person:*(iq;/*ip接收强迫变换以后的iq指针*/(bzt.*ip(;/-/result:Iam白展堂!/-(bz

7、t.*iq(;/这里我重申一下,使用了动向联编,也就是说函数在运转是才确立函数地点!/-/result:Iam白展堂!/-/*这一部分就没有什么好讲的了,很理解了!因为speak函数是一般的成员函数,在编译时就知道* 到了Baizhantang:speak的地点,所以(bzt.*ip(会输出“Iam白展堂!”,即便iq被强迫变换* 成(void(Person:*(种类的ip,可是其值亦未改变,(bzt.*iq(依旧调用iq指向处的函数* 即Baizhantang:speak.*/*好了,上边讲完了一般成员函数,我们此刻来玩一点好玩的,此刻来聊虚函数*/ip=&Person:hello;/*让i

8、p指向Person:hello函数*/(pe.*ip(;/-/result:PersonsayHello/-(bzt.*ip(;/-/result:白展堂sayHello/-/*咦,这就奇异了,为何与上边的调用结果不近似?为何两个调用结果不一致?伙伴们注意了:*speak函数是一个虚函数,前面说过虚函数其实不是采纳静态绑定的,而是采纳动向绑定,所谓动向* 绑定,就是函数地点得等到运转的时候才确立,对于有虚函数的类,编译器会给我们增添一个指针*vptr,指向一个虚函数表vptl,vptl里面寄存着虚函数的地点,子类继承父类的时候,也会继承这样* 一个指针,假如子类复写了虚函数,那么该表中该虚函数

9、地点将会由父类的虚函数地点替代成子类虚* 函数地点,编译器会把(pe.*ip(转变成为(pe.vptr1(pe,加上动向绑定,结果会输出:* PersonsayHello*(bzt.*ip(会被变换成(bzt.vptr1(pe,自然会输出:*白展堂sayHello*ps:这里我无法讲得更详尽,因为解说起来一定是很长很长的,感兴趣的话,我介绍两本书你去看一看:* 第一本是侯捷老师的,里面对于c+的虚函数特征讲的比较清楚;* 第二本是侯捷老师翻译的,一听名字就知道,讲这个就更详尽了;* 自然,不感兴趣的同学这段解说能够省略,对与使用没有影响!*/iq=(void(Baizhantang:*(ip;(bzt.*iq(;/-/result:白展堂sayHello/-system(pause;return0;内容总结(1)我们第一复习一下指向函数的指针怎样使用(2)我们第一复习一下指向函数的指针怎样使用(3)voidprint(void(*pfun((4)/赋值一个指向函数的指针(*pfun((5)/使用一个指向函数的指针比较简单,不是吗(6)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号