C++中各种可调用对象深入讲解

C++中可调用对象的深入讲解

什么是可调用对象?

在C++中,可调用对象是指可以被调用、执行的实体。常见的可调用对象包括函数、类成员函数、lambda表达式等。C++中的可调用对象都可以作为函数参数或返回值进行传递。

函数指针作为可调用对象

在C++中,函数指针也是可调用对象之一。定义函数指针的方式如下:

int (*funcPtr)(int, int); // 定义一个返回值为int,参数为两个int的函数指针

函数指针可以像函数一样被调用,例如:

int add(int a, int b) {
    return a + b;
}

int (*funcPtr)(int, int) = add; // 将函数add的地址赋值给函数指针
int result = funcPtr(1, 2); // 调用函数指针

std::function作为可调用对象

std::function是C++11中的一个函数对象包装器,它可以包裹任何可调用对象,包括函数指针、函数对象、lambda表达式等。

std::function的定义形式如下:

std::function<返回值类型(参数类型1, 参数类型2, ...)> 函数名;

例如:

#include <functional>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

class A {
public:
    int memberFunc(int a, int b) {
        return a + b;
    }
};

int main() {
    std::function<int(int, int)> funcPtr = add; // 函数指针作为可调用对象
    std::cout << funcPtr(1, 2) << std::endl;

    A a;
    std::function<int(A&, int, int)> memberFuncPtr = &A::memberFunc; // 类成员函数指针作为可调用对象
    std::cout << memberFuncPtr(a, 1, 2) << std::endl;

    auto lambdaExpr = [](int a, int b) { return a + b; }; // lambda表达式作为可调用对象
    std::function<int(int, int)> lambdaPtr = lambdaExpr;
    std::cout << lambdaPtr(1, 2) << std::endl;

    return 0;
}

可调用对象作为函数参数和返回值

可调用对象可以作为函数的参数和返回值进行传递。例如:

#include <functional>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

int calculate(std::function<int(int, int)> funcPtr, int a, int b) {
    return funcPtr(a, b);
}

std::function<int(int, int)> getFuncPtr(bool addOrSub) {
    if (addOrSub) {
        return add;
    } else {
        return sub;
    }
}

int main() {
    std::function<int(int, int)> addPtr = add;
    int result1 = calculate(addPtr, 1, 2);
    std::cout << result1 << std::endl;

    std::function<int(int, int)> subPtr = sub;
    int result2 = calculate(subPtr, 1, 2);
    std::cout << result2 << std::endl;

    std::function<int(int, int)> funcPtr1 = getFuncPtr(true);
    int result3 = funcPtr1(1, 2);
    std::cout << result3 << std::endl;

    std::function<int(int, int)> funcPtr2 = getFuncPtr(false);
    int result4 = funcPtr2(2, 1);
    std::cout << result4 << std::endl;

    return 0;
}

示例说明

示例1:使用类成员函数指针作为可调用对象

在示例代码中,定义了一个类A和一个成员函数memberFunc。我们使用std::function包裹类成员函数指针,将其作为可调用对象进行传递,并在main函数中进行了调用。

#include <functional>
#include <iostream>

class A {
public:
    int memberFunc(int a, int b) {
        return a + b;
    }
};

int main() {
    A a;
    std::function<int(A&, int, int)> memberFuncPtr = &A::memberFunc; // 类成员函数指针作为可调用对象
    std::cout << memberFuncPtr(a, 1, 2) << std::endl;

    return 0;
}

示例2:使用可调用对象作为函数参数和返回值

在示例代码中,定义了两个函数add和sub,以及一个calculate函数用于对可调用对象进行调用。在main函数中,我们使用可调用对象作为函数的参数和返回值,并进行了不同情况下的调用。

#include <functional>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

int calculate(std::function<int(int, int)> funcPtr, int a, int b) {
    return funcPtr(a, b);
}

std::function<int(int, int)> getFuncPtr(bool addOrSub) {
    if (addOrSub) {
        return add;
    } else {
        return sub;
    }
}

int main() {
    std::function<int(int, int)> addPtr = add;
    int result1 = calculate(addPtr, 1, 2);
    std::cout << result1 << std::endl;

    std::function<int(int, int)> subPtr = sub;
    int result2 = calculate(subPtr, 1, 2);
    std::cout << result2 << std::endl;

    std::function<int(int, int)> funcPtr1 = getFuncPtr(true);
    int result3 = funcPtr1(1, 2);
    std::cout << result3 << std::endl;

    std::function<int(int, int)> funcPtr2 = getFuncPtr(false);
    int result4 = funcPtr2(2, 1);
    std::cout << result4 << std::endl;

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中各种可调用对象深入讲解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 详解C语言编程中的函数指针以及函数回调

    详解C语言编程中的函数指针以及函数回调 函数指针 函数指针是指向函数的指针变量。和普通指针不同的是,函数指针指向的是函数,因此可以用来调用函数。 函数指针的定义方式如下: 返回值类型 (*指针变量名)(参数列表); 具体说明: 括号内是指针变量名 指针变量名前面的*表示该变量是指针变量 指针变量名后面的括号表示指针变量指向的是函数 括号内是参数列表,如果函数…

    C 2023年5月23日
    00
  • c语言获取当前工作路径的实现代码(windows/linux)

    要获取当前工作路径,我们需要用到C语言中的系统调用。在Windows和Linux操作系统下,这个调用名字可能不同,但是其功能是相同的,都是获取当前工作路径。下面分别介绍在Windows和Linux操作系统下,如何使用C语言获取当前工作路径。 在Windows操作系统下获取当前工作路径 在Windows操作系统下获取当前工作路径需要使用Windows API中…

    C 2023年5月24日
    00
  • C++回溯算法深度优先搜索举例分析

    当需要在一个问题的所有解中搜索特定解时,可以使用回溯算法。在搜索过程中,如果到达一个点不能通过它继续搜索了,回溯算法会回溯到上一个点继续搜索。 深度优先搜索是回溯算法的一种形式。在深度优先搜索中,我们尽可能深地搜索一个解的分支,如果达到一个结束点或无法进一步搜索,则回溯回到上一个状态并继续搜索其他分支。 在使用回溯算法解决问题时,首先必须明确问题的解空间。然…

    C 2023年5月22日
    00
  • C语言文字艺术之数据输入输出

    下面是“C语言文字艺术之数据输入输出”的完整攻略: 1. 数据输入输出的基本操作 在C语言中,我们可以使用printf函数将数据输出到屏幕上,使用scanf函数获取用户输入的数据。 #include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("…

    C 2023年5月23日
    00
  • 详解Ubuntu18.04配置VSCode+CMake的C++开发环境

    详解Ubuntu18.04配置VSCode+CMake的C++开发环境 本文将会介绍如何在Ubuntu 18.04配置VSCode和CMake的C++开发环境。以下是具体的步骤: 步骤1:安装必要的软件包 打开终端,使用以下命令来安装必要的软件包: sudo apt-get update sudo apt-get install build-essentia…

    C 2023年5月23日
    00
  • 基于C语言打造高效通讯录的示例代码

    针对“基于C语言打造高效通讯录的示例代码”的完整攻略,我们可以分为以下几个步骤来进行讲解: 1.设计数据结构 在打造通讯录的代码中,我们需要首先设计合理的数据结构来储存通讯录信息。在此我们可以采用链表数据结构来实现。所以在数据结构的设计中,需要定义一个结构体来存储每位通讯录人员的信息,然后私有一个指向实体的指针来实现链表。 2.实现通讯录基本功能 通讯录的基…

    C 2023年5月24日
    00
  • C语言实现学生消费管理系统

    【C语言实现学生消费管理系统攻略】 一、需求分析 对于学生来说,管理自己的消费是很有必要的。因此我们需要实现一款学生消费管理系统,具备以下功能: 学生信息管理:包括姓名、学号、性别等信息。 消费信息管理:包括日期、消费品种(如食物、书籍等)、消费金额等信息。 消费查询功能:能够查询某一段时间内的消费情况。 统计分析功能:能够统计学生的消费情况,如消费总额、平…

    C 2023年5月23日
    00
  • C语言实现会员计费系统

    C语言实现会员计费系统攻略 1. 确定计费规则 首先,需要明确会员计费的具体规则,例如会员类型、费率、计费方式等。 假设我们的会员分类分为普通会员和VIP会员,普通会员每个月需要缴纳100元会费,VIP会员每个月需要缴纳200元会费。考虑到未来可能会有不同的会员类型加入,我们可以将会员分类、费率等信息定义在配置文件中,通过读取配置文件的方式进行初始化。 2.…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部