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)来指向函数!因此你想通过同一个函数指针来使用的所有函数,都必须有相同的参数和返回值!