简单复习一下函数对象和函数指针。

函数指针

函数指针,简单点来理解就是一个指向函数的的指针变量,函数指针所指的是一个函数的入口地址。

函数指针主要有两个作用:用来调用函数和作为函数的参数。

函数指针的声明方法及赋值

声明方式: 数据类型标识符 (指针变量名) (形参列表)
例如: int (*fun) (int x);

其中需要注意一点,指针变量名一定要用括号括起来,因为如果不加括号,我们的编译器就会默认其为返回值为指针的一个函数。

为了方便我们的使用,我们可以用typedef进行声明。之后定义函数指针就会方便许多。例如:

typedef int(*PF) (int x);
PF pf;

对一个函数指针赋值我们不需要使用取地址符,因为一个函数的函数名就是该函数的入口指针,我们可以直接对函数指针赋值。

另外,我认为定义(或者说声明)函数指针时就只是相当于声明一个函数,所以函数指针定义时形参的变量名可以省略,
int (*fun) (int x);int (*fun) (int); 效果是一样的。

调用方法及测试

用函数指针调用函数时有两种调用方式:fun(x)(*fun)(x)
而函数指针作为函数参数时,只需要在函数定义时将其写在函数的形参中,函数内部可以直接使用函数指针指向的函数。

测试程序:

#include <iostream>
using namespace std;

typedef void (*PF) (int);

void visit(int x){
    cout << x << endl;
}

void visit_usePf(int x, void (*pf)(int)){
    pf(x);
}

int main(){
    PF pf1;
    void (*pf2) (int);
    void (*pf3) (int x);

    //typedef 声明测试
    pf1 = visit;
    pf1(1);
    (*pf1)(2);

    //第一种定义测试
    pf2 = visit;
    pf2(3);
    visit_usePf(4, pf2);

    //第二种定义测试
    pf3 = visit;
    pf3(5);
    visit_usePf(6, pf3);
}

函数对象

在C++中,实现了operator()的类或者结构体,都可被称为函数对象并进行直接调用。在学习数据结构时图的优先级遍历所使用的优先级更新器便是一个函数对象。sort函数所需要的比较器也是一个函数对象。

示例:

#include <iostream>
using namespace std;

class funA{
    public:
    void operator()(){
        cout << "Function Object" << endl;
    }
};

class funB{
    public:
    //函数输出两个数的和
    int operator()(int a, int b){
        return a + b;
    }
};

int main(){
    funA hello;
    funB sum;
    hello();
    cout << sum(1, 2) << endl;
}