C++函数对象与函数指针不同之处

转载 2012年09月02日 11:18:00
在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 

函数对象 和 函数指针 的区别

参考一: 函数对象(也称“算符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。 用函数对象代替函数指针有几个优点: 1. 首先,因为对象可以在内部修改而不用...
  • zhu2695
  • zhu2695
  • 2013年04月06日 21:17
  • 687

C++函数对象与函数指针不同之处

在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指...

C++函数对象与函数指针不同之处

在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指...

C++函数对象与函数指针不同之处

看了一篇关于C++函数对象和函数指针的区别,写得还不错的文章,特此转载,保存下来,点击查看 原文 在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一...

C++函数对象与函数指针不同之处

在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指...

C++函数对象与函数指针的不同之处

C++函数对象和函数指针之间有何不同之处?它的应用方式是否更加灵活,功能是否更加强大?在这里我们将会为大家详细介绍。 AD: 在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。...

C和C++对待全局对象的一个不同之处

今天阅读《深度探索C++对象模型》,得知在C之中,未初始化的全局对象“被视为一个‘临时性的定义’,因为它没有明确的初始化操作。一个‘临时性的定义’可以在程序中发生多次,那些实例会被链接器折叠起来,只留...

学习ThinkPHP3.2.2:了解并测试与3.1不同之处_自定义函数文件名称

原来的自定义函数文件名:Common\common.php 现在:D:\wamp\www\MyWeb\Application\Common\Common\function.php 测试...
  • bq_cui
  • bq_cui
  • 2015年10月02日 20:35
  • 1272

OC与C++的不同之处

  • 2014年06月23日 13:43
  • 2.16MB
  • 下载

指针和数组名的区别 char *str 和 char str[]的不同之处

一个简单的字符串相关程序,运行时崩溃,罪魁祸首 char *str  和 char str[]的不同之处 代码如下: view plaincopy to clipb...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++函数对象与函数指针不同之处
举报原因:
原因补充:

(最多只允许输入30个字)