用C++函数对象代替函数指针

通用算法之函数对象的制作

函数的作用和行为

C/C++程序员需要大量的定义函数,调用函数。定义函数就是编写函数的逻辑,而函数真正起作用是在其被调用时。 每一个函数都可以把它看作一个功能,或者一个算法。 程序编译好的可执行代码从外存(磁盘)加载到内存后,从主函数开始执行,之后展开一系列的函数调用。 函数的定义(函数头函数体)属于程序的代码段,在一个函数被调用到时,便开始执行它的逻辑,并把它用到的对象或调用的其他函数进行分配栈空间,压栈,出栈等。 代码空间就是函数的定义,栈空间的活动就是函数的调用。

函数的调用

函数调用非常方便,可以直接用函数名后加括号进行调用,括号里填写与定义中形式参数相匹配的实际参数。 当然也能通过定义函数指针,用函数指针指向函数地址,再通过函数指针调用函数,把函数当成函数参数传递时使用这种方法。

函数对象

C++中出现了函数对象这一名词,很简单,就是把函数封装成类,再定义该类对象,通过对象调用函数。 用到C++函数调用操作符重载,类中只需要唯一一个函数,就是函数调用函数。 之后该类对象就的行为就和函数一模一样,唯一的区别就是它是个对象,而不是函数。函数对象的优点就是能很方便的当成函数参数传递,而不需要用函数指针。

代码实现

下面代码是能一个返回两个对象较大对象的函数,封装成函数对象模板。主函数中测试该函数对象。

/*************************************************************************
	> File Name: function_object.cpp
	> Author: Willow
	> Mail: 1769003060@qq.com 
	> Created Time: 2016年07月28日 星期四 10时54分43秒
 ************************************************************************/

#include<iostream>
using namespace std;

template <typename T>
class FUN {
	public:
		const T& operator()(const T&, const T&);
};

template <typename T>
const T& FUN<T>::operator()(const T& x, const T& y)
{
	return (x > y) ? x:y;
}

int main()
{
	FUN<int> fun_int;
	FUN<double> fun_double;

	cout << fun_int(20, 40) << endl;
	cout << fun_double(40.5, 20.3) << endl;
	return 0;
}
- CATALOG -