卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章74262本站已运行436

C++ 函数指针和函数对象的区别与联系

函数指针直接指向函数,而函数对象重载了 operator() 运算符以实现可调用。两者都是 c++++ 函数调用的有用工具,函数指针高效且无状态,函数对象低效但可带状态。在实战中,函数指针常用于排序函数,函数对象则适用于自定义比较函数。

C++ 函数指针和函数对象的区别与联系

C++ 函数指针和函数对象的区别与联系

简介

函数指针和函数对象是 C++ 中实现面向对象编程的两个重要工具。它们都用于调用函数,但工作方式和用途不同。

立即学习“C++免费学习笔记(深入)”;

函数指针

函数指针是保存函数地址的变量。它就像一个指向函数的指针。要调用指向函数的函数指针,只需对其进行解引用即可。

语法:

// 声明一个函数指针类型
typedef int (*FunctionPointer)(int);

// 指向一个函数的函数指针
FunctionPointer funcPtr = &myFunction;

// 调用指向函数的函数指针
int result = funcPtr(arg);

函数对象

函数对象是一个可调用的类,它重载了 operator() 运算符。函数对象类似于函数,可以传递参数并返回结果。

语法:

// 声明一个函数对象类
class MyFunctionObject {
public:
    int operator()(int arg) {
        return arg * 2;
    }
};

// 创建函数对象
MyFunctionObject funcObj;

// 调用函数对象
int result = funcObj(arg);

区别

特征函数指针函数对象
语法指向了函数重载了 operator() 运算符
类型裸指针
效率高效低效
状态无状态可以有状态

联系

虽然函数指针和函数对象的工作方式不同,但它们都是对 C++ 中函数调用的有用的补充。函数指针非常适合低级编程任务,而函数对象则更适合面向对象编程。

实战案例

排序函数中的函数指针:

#include <algorithm>

bool compareDescending(int a, int b) {
    return a > b;
}

int main() {
    std::vector<int> nums = {1, 3, 5, 2, 4};

    // 使用函数指针对向量进行降序排序
    std::sort(nums.begin(), nums.end(), compareDescending);

    for (auto num : nums) {
        std::cout << num << " "; // 输出:5 4 3 2 1
    }
}

自定义比较函数中的函数对象:

class DescendingComparator {
public:
    bool operator()(int a, int b) const {
        return a > b;
    }
};

int main() {
    std::vector<int> nums = {1, 3, 5, 2, 4};

    // 使用函数对象对向量进行降序排序
    std::sort(nums.begin(), nums.end(), DescendingComparator());

    for (auto num : nums) {
        std::cout << num << " "; // 输出:5 4 3 2 1
    }
}
卓越飞翔博客
上一篇: Go 框架如何降低内存消耗?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏