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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值