天天看点

函数指针 详解 (第一章 函数指针介绍)

1 函数指针介绍

1.1  什么是函数指针?

1.2  入门实例介绍怎样替换switch语句

1   函数指针介绍

     函数指针提供了一些非常有趣、高效和优雅的编程技术。你可以使用他们来替换switch语句,或实现自己的late-binding(晚绑定),或实现回调函数。不幸的是,也许是由于它的语法复杂,在很多计算机书籍或文件里面都对它比较苛刻。很多时候仅仅是被简单地肤浅地提到。由于不需要为它分配内存或释放内存,所有它出现的错误比普通指针要少。你需要做的只是明白它是什么,以及学习它的语法。记住:经常问自己是否真的需要函数指针。能意识到自己的晚绑定是很好,但使用C++原有的结构体能是你的代码可读取更强,更清晰。在晚绑定的情况下:如果你调用虚函数,你的程序必须决定调用哪个函数。通过使用一个包含所有可能的函数的V-Table来实现这一点。每次调用都需要花点时间,通过使用函数指针也许你可以节省点时间,也许不能…(现在的编译器都很强大)

1.1 什么是函数指针

     函数指针就是指针,或者说是一个变量,它指向一个函数的地址。记住:一个正在跑的程序会占有主内存的一些空间。可执行程序的编译好的代码和所用到的变量都会放在这个内存里。因此程序代码中的一个函数就像一个字符域,也就是一个地址而已。重点在于你(或者编译器/处理器)怎么解释指针指向的那段内存。

1.2 入门实例介绍怎样替换switch语句

    当你想要在程序的某处(标记为label)调用函数DoIt(),你只需把函数调用DoIt()放在在源代码label处,然后你编译你的代码,这样每次程序跑到label处,你的函数就会被调用。一切进展顺利。但是,如果在编译期你不知道调用哪个函数时,怎么办?如果你想要在运行时决定调用哪个函数,怎么办?也许你想从一些函数中选出一个,或者使用所谓的回调函数。当然,你可以使用Switch语句来解决这个问题,用一个函数根据自己的意愿在不同分叉中调用不同的函数。不过还有另外一种方法:使用函数指针!下面的例子我们让任务完成4种基本算术运算种的1种。先用switch语句,然后在演示如何用函数指针来完成。

//--------------------------------------------------------------------------------

//1.2 Introductory Example or How to Replace a Switch-Statement

// ‘+’  ‘-’  ‘*’  ‘/’

#include <iostream.h>

//the four arithmetic operations

float  Plus     (float a, float b)  { return  a + b;}

float  Minus   (float a, float b)  { return  a - b;}

float  Multiply  (float a, float b)  { return  a * b;}

float  Divide    (float a, float b)  { return  a / b;}

//solution with a switch-statement

Void Switch(float a, float b, char opCode)

{

 float result;

 switch(opCode)

 {

  case  ‘+’ : result = Plus (a, b); break;

  case  ‘-’ : result = Minus (a, b); break;

  case  ‘*’ : result = Multiply (a, b); break;

  case  ‘/’ : result = Divide (a, b); break;

}

cout << “switch : 2+5=”<<result<<endl;

}

//solution with a function pointer

void Switch_With_Function_Pointer(float a, float b,

                                                  float (*pt2Func)(float, float))

{

 float result = pt2Func(a, b);

 cout<<”switch replace by function pointer: 2-5=”<<result<<endl;

}

重要注解:

       函数指针总是通过一个明确的签名(signature)来指向函数!因此你想通过同一个函数指针来使用的所有函数,都必须有相同的参数和返回值!