定义函数对象[VC/C++编程]
本文“定义函数对象[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
固然函数指针被遍及用于实现函数回调,但C++还供应了一个重要的实现回调函数的办法,那就是函数对象.函数对象(也称“算符”)是重载了“()”操作符的普通类对象.因此从语法上讲,函数对象与普通的函数行为近似.
用函数对象替换函数指针有几个长处,首先,因为对象可以在内部改正而不用窜改外部接口,因此计划更机动,更富有弹性.函数对象也具有有存储先前调用后果的数据成员.在利用普通函数时需求将先前调用的后果存储在全程大概本地静态变量中,但是全程大概本地静态变量有某些我们不肯意看到的缺陷.
其次,在函数对象中编译器能实现内联调用,从而更进一步加强了性能.这在函数指针中几近是不大概实现的.
下面举例阐明若何定义和利用函数对象.首先,声明一个普通的类并重载“()”操作符:
class Negate
{
public:
int operator() (int n) { return -n;}
};
重载操作语句中,记着第一个圆括弧老是空的,因为它代表重载的操作符名;第二个圆括弧是参数列表.普通在重载操作符时,参数数目是固定的,而重载“()”操作符时有所差别,它可以有肆意多个参数.
因为在Negate中内建的操作是一元的(只有一个操作数),重载的“()”操作符也只有一个参数.返回范例与参数范例相同-本例中为int.函数返回与参数标记相反的整数.
利用函数对象
我们目前定义一个叫Callback()的函数来测试函数对象.Callback()有两个参数:一个为int一个是对类Negate的引用.Callback()将函数对象neg作为一个普通的函数名:
#include <iostream>
using std::cout;
void Callback(int n, Negate & neg)
{
int val = neg(n); //调用重载的操作符“()”
cout << val;
}
不要的代码中,注意neg是对象,而不是函数.编译器将语句
int val = neg(n);
转化为
int val = neg.operator()(n);
普通,函数对象不定义构造函数和析构函数.因此,在成立和销毁历程中就不会发生任何问题.前面曾提到过,编译器能内联重载的操作符代码,所以就避免了与函数调用相关的运行时问题.
为了完成上面个例子,我们用主函数main()实现Callback()的参数传送:
int main()
{
Callback(5, Negate() ); //输出 -5
}
本例传送整数5和一个暂时Negate对象到Callback(),然后程序输出-5.
以上是“定义函数对象[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |