• 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++后台开发技能树)

  • 相关阅读:
    洛谷P2402 奶牛隐藏
    BZOJ2150: 部落战争
    HDU 6405 Make ZYB Happy(广义SAM)
    CodeForces
    2019CCPC秦皇岛 E题 Escape(网络流)
    2019CCPC秦皇岛D题 Decimal
    2019CCPC秦皇岛I题 Invoker(DP)
    2019CCPC秦皇岛 F Forest Program
    2019CCPC秦皇岛 J MUV LUV EXTRA(KMP)
    2019CCPC秦皇岛 K MUV LUV UNLIMITED(博弈)
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/10386963.html
Copyright © 2020-2023  润新知