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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指向类的成员函数的指针如何使用(详解)

我们首先复习一下指向函数的指针如何使用? void print() { } void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 void pfun = print; //赋值一个指向函数的指针 (*pfun)(); //使用一个指向函数的指针 比较简单,不是吗?为什么*pfun 需要用()扩起来呢?因为*的运算符优先级比()低,如果不用()就成了*(pfun()). 指向类的成员函数的指针不过多了一个类的限定而已! class A { void speak(char *, const char *); }; void main() { A a; void (A::*pmf)(char *, const char *);//指针的声明 pmf = A::speak; //指针的赋值 } 一个指向类 A 成员函数的指针声明为: void (A::*pmf)(char *, const char *); 声明的解释是:pmf 是一个指向 A 成员函数的指针,返回无类型值,函数带有二个参 数,参数的类型分别是 char *和 const char *。除了在星号前增加 A::,与声明外部函数指针的方法一样。一种更加高明的方法是使用类型定义: 例如,下面的语句定义了 PMA 是一个指向 A 成员函数的指针,函数返回无类型值,函数参数类型为 char *和 const char *: typedef void(A::*PMA)(char *, const char *); PMA pmf= A::strcat; // pmf 是 PMF 类型(类 A 成员指针)的变量 下面请看关于类的使用的示例程序! #include iostream using namespace std; class Person { public: /*这里稍稍注意一下,我将speak()函数设置为普通的成员函数,而hello()函数设置为虚函数*/ int value; void speak() { cout I am a person! endl; printf (%d\n, Person::speak); /*在这里验证一下,输出一下地址就知道了!*/ } virtual void hello() { cout Person say \Hello\ endl; } Person() { value = 1; } }; class Baizhantang: public Person { public: void speak() { cout I am 白展堂! endl; } virtual void hello() { cout 白展堂 say \hello!\ endl; } Baizhantang() { value = 2; } }; typedef void (Person::*p)();//定义指向Person类无参数无返回值的成员函数的指针 typedef void (Baizhantang::*q)();//定义指向Baizhantang类的无参数无返回值的指针 int main() { Person pe; int i = 1; p ip; ip = Person::speak; //ip指向Person类speak函数 (pe.*ip)(); //这个是正确的写法! //-------------------------------------------- // result : I am a Person! // XXXXXXXXXX(表示一段地址) //-------------------------------------------- /* *下面是几种错误的写法,要注意! * pe.*ip(); * pe.(*ip)(); * (pe.(*ip))(); */ Baizhantang bzt; q iq = (void (Baizhantang::*)())ip; //强制转换 (bzt.*iq)(); //-------------------------------------------- // result : I am a Person! // XXXXXXXXXX(表示一段地址) //-------------------------------------------- /* 有人可能会问了:ip明明被强制转换成了Baizhantang类的

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档