《C++ primer》学习笔记之二十二: 函数指针

本文深入讲解了函数指针的概念及应用,包括基本定义、数组形式的函数指针、类成员函数指针等,并通过示例代码展示了如何正确使用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 函数指针:
 void f(){}
 void (*pf)() = f;  //指向函数f的指针
 void (*pf2)() = &f;  //'&'操作符可有可无
 (*pf)();    //调用函数f()

 pf(); //像普通的函数调用一样
 
 //另外一种更好的方法,用typedef将函数的指针的定义分为几步
 typedef void (dclFun)(); //dclFun相当于一个函数原形。推荐
 typedef void dclFun2();  //与上一个等同,没上一个清晰
 dclFun *pf3 = f;   //指向函数f的指针。   推荐
 (*pf3)();
 
 //函数指针数组:
 void (* pf4[])() = {f, f, f}; //pf为一个数组,其成员为指向函数的指针
 dclFun * pf5[] = {f, f, f};  //意义与上句同,但毫无疑问要清晰很多。 推荐
 pf4[0]();     //调用函数f()。        推荐
 (pf4[1])();     //调用函数f()
 (*(pf4 + 2))();    //调用函数f()
 *pf4();      //error: 此句等同于:*(pf4()), 而pf4为一个数组
 
 
 //当函数为类的一个成员时:定义不同了,要指明class scope
 class A
 {
  void g(){}
 }
 
 void (A:: *pg)() = A::g; //指向类A的成员函数的指针
        //注意:变量名总与指针符*在一起,下面是些错误的写法
        //error: void A::(*pg)();
        //   void (* A::pg)();
        //   A::void (*pg)();
        
 dclFun A:: *pg3 = A::g;  //Ok. 与上句同。(注意:dclFun已在前面定义)。推荐
         
 A a;
 (a.*pg3)();     //调用A::g,使用'.*'操作符,这个是指向类成员(member data/ method)指针的专用操作符
        //'.*'比'*'低一档,所以使用它时最好用括号括起来。下面是些错误的写法:
        //error: a.*pg(); //这个等同于 a.*(pg()),而直接调用pg()是错误的
        //             推荐
 
 //下面企图把'A::'包含在typedef中然后再重命名,都失败了:
 /* error:
  typedef void A:: dclFunOfA();
  typedef void (A:: dclFunOfA)();
  typedef void A:: (dclFunOfA)();
  typedef A:: void (dclFunOfA)();
  typedef void (dclFunOfA)()A:: ;
  typedef dclFun A:: dclFunOfA;
  typedef A:: dclFun dclFunOfA;
  typedef dclFun dclFunOfA A:: ;
  typedef (A:: *dclFunOfA)();   //这个倒可以,但dclFunOfA不是函数的声明,而是一个函数指针,不是想要的
 */
         
 //函数指针数组
 void (A:: * pg4[]){} = {A::g, A::g, A::g};
 dclFun A:: * pg5[] = {A::g, A::g, A::g};        推荐  
 (a.*( pg4[0] ))();   //调用函数A::g
 (a.*pg4[1])();    //调用函数A::g,'[]'的优先级比'.*'高。  推荐
 (a.*( *(pg4 + 2) ) )();  //调用函数A::g
 (a.* *(pg4 + 2) )();  //调用函数A::g。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值