专栏首页从零开始学 Web 前端C++的函数对象优于函数指针地方

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 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • *(int*)&p

    分析: void(p)(); 这行代码定义了一个指针变量p,p指向一个函数。这个函数的参数和返回值都为void。 &p是求指针变量p本身的地址。 ...

    Daotin
  • C/C++练习题(三)

    分析:在我们看来,虽然使用字符数组和字符指针差不多,printf都可以打印出字符串出来,但是编译器对他们的处理完全不同。 对于字符指针,编译器看到后,...

    Daotin
  • #define a int[10]与 typedef int a[10]用法

    Daotin
  • P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到...

    attack
  • 「2017 Multi-University Training Contest 2」2017多校训练2

    给定数组a[1..n]和b[1..n],b[i]在[1~n]内。要得到a[n+1..2n],每次选b数组的一个,令a[i]为j=b[k]到i-1位置中最大的a[...

    饶文津
  • 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A-------------------------------------------------------------------------------...

    Angel_Kitty
  • CSU 1326: The contest(分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:       n个题目,每个题目都有一个价值P...

    用户1624346
  • BZOJ4300: 绝世好题(dp)

    给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。

    attack
  • HDU 3488 Tour(拆点+二分图最大权匹配--KM)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488

    Ch_Zaqdt
  • 1035. 插入与归并(25)

    插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

    AI那点小事

扫码关注云+社区

领取腾讯云代金券