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++ Primer 第一部分基本语言

    C++ Primer 第一部分基本语言攻略 1. C++语言基础 本章节主要介绍了C++语言的基础知识,包括C++程序的结构、语句、类型、变量等。 C++程序的结构 #include <iostream> //头文件 int main() //主函数 { std::cout <<"Hello, world!" &l…

    C 2023年5月22日
    00
  • Gin框架之参数绑定的实现

    Gin框架之参数绑定的实现 1. 参数绑定 在Gin框架中,我们可以通过Context结构体中的方法Bind方法来进行参数绑定。Bind方法提供的参数绑定能力非常强大,支持多种类型的参数绑定,例如querystring参数、form参数、json格式参数、xml格式参数等。 2. 示例 2.1 绑定querystring参数 package main imp…

    C 2023年5月23日
    00
  • 小米4c怎么样?小米4C发布会全程回放(图文评测)

    小米4c评测攻略 简介 小米4c是小米科技于2015年9月发布的一款手机,标志着小米4系列的升级。这款手机拥有优秀的性能和良好的用户体验,是一款性价比较高的手机。 在本篇攻略中,我们将全面讲解小米4c的机型特点,性能表现,使用评测等相关内容,以帮助感兴趣的用户更好地了解小米4c的情况。 小米4c机型特点 小米4c继承了小米4系列的设计风格,整体外观简单大方。…

    C 2023年5月22日
    00
  • VS2022创建Windows服务程序的方法步骤

    以下是VS2022创建Windows服务程序的方法步骤: 1. 创建新项目 打开Visual Studio 2022,选择“创建新项目”,在弹出的窗口中选择“Windows服务”,命名并选择项目保存位置后,点击“创建”按钮。 2. 编写代码 创建完成后,打开新建项目,可以看到项目中已经自动生成了一个Service1.cs文件。接下来,在Service1.cs…

    C 2023年5月23日
    00
  • C++编程面向对象入门全面详解

    C++编程面向对象入门全面详解攻略 本篇攻略旨在为初学者提供C++编程中面向对象的入门指南,以及相关基础概念的详细介绍。 面向对象编程的概念 面向对象编程是一种程序设计范型,它将现实世界中的事物抽象、封装为类,并通过类之间的继承、组合等关系,对这些事物进行描述和操作。 在C++中,面向对象编程主要包含以下几个方面: 类(Class):描述某一类事物的数据和行…

    C 2023年5月22日
    00
  • 在PHP语言中使用JSON和将json还原成数组的方法

    接下来我将详细讲解如何在PHP语言中使用JSON以及将JSON还原成数组的方法。 将数组转换成JSON字符串 在PHP中,可以使用json_encode()函数将数组转换成JSON字符串。该函数的语法如下: json_encode(mixed $value, int $options = 0, int $depth = 512): string|false …

    C 2023年5月23日
    00
  • C#实现简单的计算器小程序

    C#实现简单的计算器小程序 简介 本教程旨在介绍如何使用C#编写一个简单的计算器小程序。本教程所需环境为Visual Studio 2019。 步骤 1. 创建新工程 首先,我们需要创建一个新的C#控制台应用程序工程,步骤如下: 打开Visual Studio 2019并选择“创建新项目”。 在“创建项目”窗口中选择“控制台应用程序”。 为您的应用程序命名,…

    C 2023年5月30日
    00
  • VC++基于Dx实现的截图程序示例代码

    VC++是微软推出的一种编程语言,Dx是指DirectX,是微软公司推出的一套多媒体编程接口,用于开发游戏和多媒体应用程序。本篇攻略介绍如何使用VC++基于Dx实现的截图程序示例代码。 步骤一:准备工作 首先需要安装Visual Studio,可在微软官网下载最新版Visual Studio,安装后创建Win32控制台应用程序项目。 接下来需要在VC++项目…

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