版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luo870604851/article/details/86376072
函数对象:所有重载了函数调用操作符(operator())的类对象。通过将operator设置为内联函数,可以使程序性能加速。即把对象当做函数使用。
函数指针:指向某种(函数参数,返回值)的函数类型的指针,每个函数都有一个入口地址,函数指针便是指向了函数的入口地址。通过将函数指针传入函数中,方便一个函数调用另一类型的函数。如: int GetMaxValue( double x, bool (*ptr)(int, int) ),其中ptr即为函数指针。
普通对象VS类指针
#include <iostream>
using namespace std;
class Distance
{
private:
int feet; // 0 到无穷
int inches; // 0 到 12
public:
// 所需的构造函数
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
// 重载函数调用运算符
Distance operator()(int a, int b, int c)
{
Distance D;
// 进行随机计算
D.feet = a + c + 10;
D.inches = b + c + 100 ;
return D;
}
// 显示距离的方法
void displayDistance()
{
cout << "F: " << feet << " I:" << inches << endl;
}
};
void test(int a,int b,int c){
Distance D;
Distance A=D(a,b,c);//这里是函数对象调用函数
A.displayDistance();
};//类外定义函数test
int main()
{
Distance D1(11, 10), D2,D3;//构造函数与默认构造函数
cout << "First Distance : ";
D1.displayDistance();
D2 = D1(10, 10, 10); // invoke operator(),这里是函数对象调用函数
cout << "Second Distance :";
D2.displayDistance();
Distance* p;//p指向类Distance,也即*p是类Distance的指针对象
//区分这个*p与下面*q本质上的不同,这里*p是一个函数对象,通过()运算符重载实现函数调用功能
D3=(*p)(20,20,20);
cout << "third Distance :";
D3.displayDistance();
void (*q)(int,int,int);//初始化函数指针
q=test;//定义函数指针,与q=&test等价
q(20,20,20);//函数指针调用函数
(*q)(20,20,20);//函数指针解引用调用函数,与上一条等价
return 0;
}
输出:
First Distance : F: 11 I:10
Second Distance :F: 30 I:120
third Distance :F: 50 I:140
F: 50 I:140
F: 50 I:140