• 函数指针


    函数指针是一种特殊类型的指针,它指向一个函数而不是指向数据。函数指针允许你在程序运行时动态地选择要调用的函数,这对于实现回调函数、事件处理、动态加载库和创建通用函数接口等任务非常有用。

    1. 声明函数指针

    要声明一个函数指针,你需要指定它将指向的函数的签名,包括返回类型和参数列表。函数指针的声明形式如下:

    return_type (*function_pointer_name)(parameter_types);
    • return_type:函数的返回类型。
    • function_pointer_name:函数指针的名称。
    • parameter_types:函数的参数类型列表。

    例如,下面是一个声明函数指针的示例:

    int (*addPtr)(int, int); // 声明一个指向返回int类型、接受两个int参数的函数指针

    2. 初始化函数指针

    你可以将函数指针初始化为指向特定的函数。这样,函数指针将指向该函数的代码,以便你可以使用它来调用该函数。以下是初始化函数指针的示例:

    addPtr = add; // 将函数指针addPtr指向add函数
    • 现在,addPtr 指向了 add 函数。

    3. 使用函数指针调用函数

    一旦函数指针指向了函数,你可以使用它来调用该函数,就像调用普通函数一样。示例如下:

    int result = addPtr(5, 3); // 使用函数指针调用add函数
    • result 将包含 add(5, 3) 的返回值,即 8。

    4. 函数指针的数组和指向函数的指针

    你还可以创建函数指针的数组或指向函数指针的指针,以处理多个函数或更复杂的情况。这些构造允许你在运行时选择要执行的函数。

    函数指针的数组:
    1. int (*operation[])(int, int) = {add, subtract}; // 创建一个包含add和subtract函数指针的数组
    2. int result1 = operation[0](5, 3); // 调用add函数
    3. int result2 = operation[1](5, 3); // 调用subtract函数
    指向函数指针的指针:
    1. int (*(*ptrToFuncPtr))(int, int) = &addPtr; // 创建一个指向addPtr的指针
    2. int result = (*ptrToFuncPtr)(5, 3); // 通过指针调用addPtr指向的add函数

    5. 成员函数指针

    除了普通函数,C++还支持成员函数指针,用于调用类的成员函数。成员函数指针的声明和使用方式略有不同,如下所示:

    1. class MyClass {
    2. public:
    3. int add(int a, int b) {
    4. return a + b;
    5. }
    6. };
    7. int (MyClass::*memberFunctionPtr)(int, int) = &MyClass::add; // 成员函数指针声明和初始化
    8. MyClass obj;
    9. int result = (obj.*memberFunctionPtr)(5, 3); // 使用成员函数指针调用成员函数

    6. 使用std::functionstd::bind

    C++还提供了更高级的功能,如 std::functionstd::bind,它们可以用于封装函数指针和函数对象,使函数调用更灵活和容易管理。

    1. #include
    2. #include
    3. int add(int a, int b) {
    4. return a + b;
    5. }
    6. int main() {
    7. std::function<int(int, int)> operation = add; // 使用std::function封装函数指针
    8. int result = operation(5, 3); // 调用封装的函数指针
    9. std::cout << "Result: " << result << std::endl;
    10. return 0;
    11. }

    std::function 允许你将函数指针、函数对象和lambda表达式封装为一个可调用的对象,从而提供了更大的灵活性。

    总之,C++函数指针是一种强大的工具,可用于实现动态函数调用和创建通用接口。通过了解函数指针的基本概念和用法,你可以更好地理解和利用这一功能来满足各种编程需求。

    总结

    使用:

    • 普通函数
    1. void display(string name) {
    2. cout << "hello " << name << endl;
    3. }
    4. void display2() {
    5. cout << "hahahhaha" << endl;
    6. }
    7. int main() {
    8. void (*p1)() = lambda_use;
    9. p1();
    10. typedef void (*func1)();
    11. func1 p2 = display2;
    12. p2();
    13. typedef void (*func2)(string name);
    14. func2 p3=display;
    15. p3("张三");
    16. void (*p4)(string name) = display;
    17. p4("李四");
    18. return 0;
    19. }

     

    • 类成员函数和静态函数
    1. class base {
    2. public:
    3. void display() {
    4. cout << "这是base类的display!" << endl;
    5. }
    6. static void run() {
    7. cout << "这是静态成员函数run!" << endl;
    8. }
    9. };

    1. base b;
    2. void (base:: * p2)() = &base::display;//指向普通成员函数
    3. (b.*p2)();
    4. //使用typedef
    5. typedef void (*func)();
    6. func p1 = &base::run;//指向静态成员函数
    7. p1();
    8. //不使用typedef
    9. void(*p1)() = &base::run;//指向静态成员函数
    10. p1();

    • lambda表达式
    1. typedef void (*Func)(string name);
    2. Func p2= [](string name) {
    3. cout << "hello !" << name << endl;
    4. };
    5. void (*p1)(string name) = [](string name) {
    6. cout << "hello !" << name << endl;
    7. };
    8. p1("张三");
    9. p2("赵六");

     

    函数指针缺点:

    • 1.不支持指向仿函数
    • 2.指向类成员函数时,需要加上“ 类名:: ”,区分普通函数和类成员函数,而定义不同的函数指针。
  • 相关阅读:
    PaddleOCR服务化部署
    【原创】FFMPEG录屏入门指南
    Oracle 逻辑备份(数据迁移)
    Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix
    排序及其代码详解~
    Redis的集群模式搭建
    【Qt炫酷动画】demo04-仿Android旋转图标的等待对话框动画
    面试中的常问的C++ STL 概念和函数
    后台平台总结
    JSD-2204-酷莎商城-ElementUI-Day07
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/132767624