函数指针

  函数指针顾名思义,就是指向函数的一个指针,就像数组的名字就是一个指向

数组第一个元素的指针。同样的,函数的名字也是一个指向一个函数的指针常量。

  通常来说,不应该使用函数指针,使用函数指针能够支持具备面向对象的某些

修点的编程风格;然而,如果编写的是高度动态的,需要基于运行阶段的决策执行

不同操作的程序,函数指针可以提供可行的解决方案。而有的时候这个解决方案更

加方便和简洁。

  函数指针的声明方法:

  long (*pFuncOne) (int, int);

  这是指向一个有两个int型参数,返回值为long型的一个函数指针。注意中间的

括号是必不可少的,如果去掉就变成了一个返回long型的指针的函数了,而不是函

数指针了。

  例子:

  void Square (int &, int &);
void Cube (int &, int &);
void Swap (int &, int &);

  void GetVals(int &, int &);

  在这里我们声明函数指针的时候由于声明的写法太长,如果声明的地方多的话每

次都写那么长势必很麻烦所以我们可以用tpyedef。

   typedef  void (*VPF) (int &, int &);

  在后面声明的时候可以直接写,VPF pFunc;就可以了。

   
        switch (choice)
        {
        case 1: pFunc = GetVals;
            break;
        case 2: pFunc = Square;
            break;
        case 3: pFunc = Cube;
            break;
        case 4: pFunc = Swap;
            break;
        default: fQuit = true;
            break;
        }

  如上面的代码就是根据choice的值来决定pFunc指向哪个函数,也就

是程序将调用哪个函数。如果不用函数指针的话我们必须在switch体中调

用函数,那么如果跟随这个被调用函数还要执行一些其他函数,比如打印

一条数据出来,那么在每条case下面都要重复的写这个输出函数,这样就

有大量的重复代码。如果用函数指针这里只是决定调用哪个函数,执行是在

后面一起去执行。当然它的公用也不仅仅如此,可能还有更多更奇妙的用法

   既然这是个指针当然也是可以传递给其他函数的。

  void Print(VPF, int, int);

可以像传其他参数一样的传递它。在使用的时候,如上面的指针pFunc,我

们可以直接:pFunc(3, 4);这样的来使用。

  其实这些都不是很经常用到的东西,如果能用其他方法解决尽量的用其

他方法去解决。函数指针有他一定的危险性,可能在本想调用函数时候不小

心给函数指针赋值了,也可能本想复制时不小心调用了函数。

面向对象编程通常应该让你能够避免创建或者传递函数指针而是通过所需的对

象调用所需的函数或通过类 调用所需的镜头函数。

原文地址:https://www.cnblogs.com/sunnystone85/p/1402670.html