• C++的函数对象优于函数指针地方


    转载自:http://blog.csdn.net/huang_xw/article/details/7934156    

        在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系。

    C++函数对象实质上是一个实现了operator()--括号操作符--的类。

    下面是函数对象与函数指针的例子:

    namespace
    {
    	class AddCls
    	{  
    	public:  
    		int operator()(int a, int b)  
    		{  
    			return a + b;  
    		}  
    	};
    
    	int AddFunc(int a, int b)  
    	{  
    		return a + b;  
    	}
    }
    
    void test_addObj()
    {
    	// 定义函数对象
    	AddCls addObj; 
    	PRINT_DEBUG(addObj(3, 4);
    }
    
    void test_addFunPtr()
    {
    	typedef int (*FunPtr) (int a, int b);  
    	FunPtr addFunPtr = &AddFunc;
    	PRINT_DEBUG(addFunPtr(3, 5));
    }



    除了定义方式不一样,使用方式可是一样的。

    既然C++函数对象与函数指针在使用方式上没什么区别,那为什么要用函数对象呢?很简单,函数对象可以携带附加数据,而指针就不行了。下面就举个使用附加数据的例子:

    class less  
    {  
    public:  
        less(int num):n(num){}  
        bool operator()(int value)  
        { 
            return value < n;  
        }  
    private:  
        int n;  
    };
    less isLess(10);
    cout << isLess(9) << " " << isLess(12); // 输出 1 0 
    

    另一个例子:

    const int SIZE = 5;  
    int array[SIZE] = { 50, 30, 9, 7, 20};  
    // 找到小于数组array中小于10的第一个数的位置  
    int * pa = std::find_if(array, array + SIZE, less(10));
    // pa 指向 9 的位置  
    // 找到小于数组array中小于40的第一个数的位置  
    int * pb = std::find_if(array, array + SIZE, less(40)); 
    // pb 指向 30 的位置

    要想让一个函数既能接受函数指针,也能接受函数对象,最方便的方法就是用模板。如:

    template<typename FUNC>
    int count_n(int* array, int size, FUNC func)  
    {  
      int count = 0;  
      for(int i = 0; i < size; ++i)  
      if(func(array[i]))  
        count ++;  
      return count;  
    }

    这个函数可以统计数组中符合条件的数据个数,如:

    const int SIZE = 5;  
    int array[SIZE] = { 50, 30, 9, 7, 20};  
    cout << count_n(array, SIZE, less(10)); // 2  
    // 用函数指针也没有问题:  
    bool less10(int v)  
    {  
      return v < 10;  
    }  
    cout << count_n(array, SIZE, less10); // 2 
  • 相关阅读:
    适配器模式
    代理模式
    单例模式
    构建者(建造者)模式
    js Math方法
    补零
    js中十进制与二进制、八进制、十六进制的互相转换
    js生成一个范围内随机数Math.random
    js不改变原数组的情况下取数值数组的最大值和最小值
    自己封装方法,功能跟数组的indexof一样
  • 原文地址:https://www.cnblogs.com/lvonve/p/8832426.html
Copyright © 2020-2023  润新知