c++学习之初话 函数指针和函数对象 的因缘

函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性。

函数对象的本质:()运算符的重载。我们通过一段代码来感受函数指针和函数对象的使用:

 1 int AddFunc(int a, int b)  
 2 {  
 3     return a + b;  
 4 }  
 5  
 6 class Add
 7 {
 8 public:
 9     const int operator()(const int a,const int b)
10     {
11         return a+b;
12     }
13 };
14  
15 int main()
16 {
17     //函数指针
18     int (*Add1)(int a,int b);
19     int (*Add2)(int a,int b);
20     Add1 = &AddFunc;
21     Add2 = AddFunc;//两种函数指针赋初值方法
22     cout << (*Add1)(3,2)<<endl; // 5
23     cout<<Add1(3,2)<<endl;//输出可以加*,也可以不加
24  
25     //函数对象
26     Add addFunction;
27     cout<<addFunction(2,3)<<endl;//调用类的重载操作符()方法
28     system("pause");
29     return 0;
30 }

我们可以看到:函数AddFunc和类Add本质上都是实现了对a+b的加法运算。从功能上讲,两者并无区别,但从设计上讲,两者的区别很大,一个将功能封装成函数,一个封装成类。

我们再来关注两种方式下的调用过程:

1  函数指针:

        我们使用函数指针的目的在于:使用指针的方式来调用函数。

可能我们之前使用使用指针的场合过少,以至于使得我们忘了指针的强大(我们可以将指针指向任意一种类型,无论是基础类型,还是派生类型,只要指针定义的合理)。既然要使用指针调用函数,首先需要声明一个函数指针(这就如同你要想将一个指针指向整型数据,要先声明一个int*指针),声明了函数指针之后,将该指针指向我们要调用的函数(这就是第20行和21行做的事),函数指针指向了我们要调用的函数,就可以用函数指针来调用函数了(22行的代码)。因此,不管是函数指针还是其他指针,指针的基本使用思想是一致的

1   定义 和所要指向对象类型相同(这里是函数)的指针(指向对象是什么类型,自己就是什么类型的指针)

2   将指针指向调用对象

3  使用指针的方式代替对象本身执行相应功能。

2  函数对象

      我们使用函数指针的目的在于:使用对象(真正意义上的c++中的对象)的方式来调用函数(是不是和上面很类似)

假如我们先不考虑运算符重载这个层面的东西,仅仅是考虑上层的东西,来思考其中的函数对象的运作机制:

     首先,我们将所要执行的功能封装成了一个类(这个类本质上实现了()运算符的重载),因为我们封装成了类,所以我们可以声明对象;因为这个类本质上实现了函数运算符()的重载,所以我们将这个对象称之为函数对象。也就是,首先,我们基于c++的基本思想(万物皆可对象),将函数封装成了类,然后用该类声明对象,则该对象就是函数对象,使用这个函数对象,我们可以完成函数的调用。   我们来看看函数独享的基本使用过程是:

1  定义 和所要“指向”类型相同(这里是类)的(函数)对象

2  使用函数对象的方式执行相应的功能

我们可以发现:函数对象的使用更加简洁,也更加符合c++的程序设计思想!

(ps:附上c++后台开发技能树)

posted @ 2019-02-16 10:38  少年π  阅读(458)  评论(0编辑  收藏  举报