zoukankan      html  css  js  c++  java
  • c++入门之函数指针和函数对象

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性。函数对象的本质:()运算符的重载。我们通过一段代码来感受函数指针和函数对象的使用:

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

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

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

    1  函数指针:

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

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

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

    2   将指针指向调用对象

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

    2  函数对象

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

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

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

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

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

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

  • 相关阅读:
    Ruby入门(1)——windows下Ruby开发环境搭建
    [译]Java 程序员应该了解的 10 个面向对象设计原则
    一款ios版本的IM聊天应用项目源码
    Dollars即时聊天客户端应用源码
    微一微博的应用项目源码
    模仿qq客户端应用源码且带安装包
    手机淘宝客应用(服务端+客户端+数据库)源码项目
    哆啦A梦消除连连看游戏源码项目完整版
    音乐社交APP源码ios版
    iOS媒体视频播放器应用源码
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/10523653.html
Copyright © 2011-2022 走看看