函数对象和函数指针

8 篇文章 0 订阅
5 篇文章 0 订阅

函数指针

  • 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。

  • 用途:用作调用函数和做函数的参数。

  • 声明方法:数据类型标志符 (指针变量名) (形参列表)
    int (*func) (int x); 这里的(*func)不能去掉括号,去掉括号就是返回值为int指针的函数声明。

  • 一般用typedef:
    typedef int (*PF) (int x); PF pf;

  • 用法示例:

      typedef void (*PFT) (int &);
    
      void bar(int &i)
      {
          i++;
          return ;
      }
      
      int main()
      {
          PFT pft=bar;
          std::vector<int> ivec{3, 4, 2, 8, 15, 267};
          std::for_each(ivec.begin(), ivec.end(), bar);
      
          return 0;
      }
    
  • 优点:使程序更加清晰易懂,编码方便。函数指针是C推崇的,也是鲜明的C的特征。

函数对象

  • 函数对象,从名字上可以看到是一个对象,它本质上就是一个类对象,但是它的功能和函数极为相似。所以我们将他称为函数对象。通常的做法是定义一个struct或者class,并重载它的operator()即可。

  • 用途:可以等效为函数指针,但比它更强大。

  • 用法:

      class Inc
      {
      public:
          void operator()(int& a)
          {
              ++a;
          }
      };
    

Inc()就是一个函数对象了。实际上就是调用Inc().()
std::for_each(ivec.begin(), ivec.end(), Inc());

  • 优点:
    • 相比函数指针,性能更高。因为调用Inc()的operator()实质上是调用这个类成员的成员函数,而这个成员函数默认是inline的。但函数指针就是普通的调用函数,效率低。(这里要知道inline内联函数的优势)

    • 相比函数指针,可以记录函数状态,即我们不用全局变量就可以达到记录状态的功能,并且更加安全。

        //函数对象
        class Countfrom
        {
        private:
            int &count;
        public:
            Countfrom(int& n):count(n)
            {
            }
            int operator()()
            {
                return count++;
            }
        };
        // 函数指针
        int s = 10;
        int fCountfrom()
        {
            return s++;
        }
         
        int main()
        {
            int state(10);
            int ar[11];
            std::generate_n(ar,11,Countfrom(state));
            // std::generate_n(ar,11,fCountfrom);
            for(int i = 0; i < 11; ++i)
                std::cout<<ar[i]<<std::endl;
            system("pause");
        }
      
    可以看到函数指针要想记录,需要用全局变量。而函数对象实质是个类对象,可以定义自己的成员变量。只需自己内部的count即可,更加灵活安全。
  • 故我们可以在函数对象内部,定义自己的成员变量,这大大增加了灵活性。

总结:在C++中更推崇函数对象的做法,因为本质就是类。在STL中有很多这种用法,并且在Effective C++中也有很多泛型编程的讲解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值