函数对象与函数指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/luo870604851/article/details/86376072
今日推荐