C++ - 函子与函数的区别

2024年8月29日 | 阅读 7 分钟

在本文中,您将学习函数对象 (functor)函数 (function) 之间的区别。但在讨论它们的区别之前,您必须了解 C++ 中的函数对象和函数。

C++ 中的函数对象 (Functor) 是什么?

函数对象 (functor) 有时被称为“函数对象”。它是一个对象,可以像 C++ 中的函数一样被调用。重载了 operator() 函数调用运算符的类实例称为函数对象。这使得可以使用对象,就像使用函数一样,为类提供了一种封装行为的方式。

函数对象 (Functor) 的关键要素

函数对象 (functor) 有几个关键要素。一些主要的函数对象要素如下:

1. 面向对象的调用能力

函数对象是具有像函数一样被调用的能力的。这被称为面向对象的调用能力。它使得它们在需要更复杂函数的场景下非常灵活。

2. 状态的封装

与普通函数相比,函数对象能够包含内部状态。通过修改和保留此状态,可以在多次调用之间维护信息。

3. 使用的灵活性

函数对象的设计和使用都非常灵活。通过自定义以封装特定行为并包含成员变量以维护状态,可以生成更具表现力和可重用性的代码。

4. 性质

重载了operator() 函数调用运算符的类的实例称为函数对象。

5. 有状态性

具有内部状态的函数对象可以在调用之间保留数据,这被称为有状态性。

6. 用途

由于函数对象可以保留状态,因此它们提供了更大的灵活性,适用于需要封装行为和状态的场景。

语法

它具有以下语法:

函数对象 (Functor) 的优点

函数对象 (functor) 有几个优点。一些主要的函数对象优点如下:

  1. 定制性: 使用函数对象,开发人员可以通过封装状态和适当地修改行为来构建高度定制的可调用实体。
  2. 代码重用性: 通过将相关行为分组到类中,可以提高代码重用性。在代码库的不同部分重用函数对象非常简单。
  3. 函数式编程风格: 函数对象通过提供一种对象传递方法,使 C++ 编程更具函数式特性,这对于算法和标准库函数特别有用。

示例

让我们看一个例子来说明 C++ 中函数对象 (functor) 的使用

输出

Result of multiplying by two: 10
Result of multiplying by three: 15

说明

1. 头文件包含

代码中包含了<iostream> 头文件,这是 C++ 输入输出操作所必需的。

2. 函数对象类定义

  • 代码定义了一个名为MultiplyFunctor 的函数对象类。
  • 该类包含一个公共构造函数和一个私有成员变量 factor,用于初始化它。
  • 重载了operator() 函数调用运算符,这是该类的主要特征,它允许类的实例像函数一样被调用。

3. 构造函数

当接收到一个整数 f 作为参数时,MultiplyFunctor 构造函数会使用提供的该值初始化私有成员 factor。

4. 函数调用运算符重载

  • operator() 函数接收一个整数值作为输入时,它会使用内部的 factor 将该值乘以输入的值。
  • 此运算符重载允许将 MultiplyFunctor 的实例用作函数。

5. main 函数

  • 该程序的主入口点。主要功能是程序的入口。
  • 创建了两个 MultiplyFunctor 实例,分别命名为 multiplyByTwo 和 multiplyByThree,其 factor 分别为 2 和 3。

6. 使用函数对象 (Functor)

  • 然后,使用函数对象进行乘法运算,就像调用函数一样。
  • multiplyByTwo(5) 和 multiplyByThree(5) 分别将数字 5 与对应的 factor 2 和 3 相乘。

7. 查找并显示结果

使用 std::cout 在控制台打印消息,以显示结果。

8. Return 语句

return 0; 语句表示程序成功执行。

C++ 中的函数是什么?

C++ 中的函数 (function) 是执行特定任务的可重用代码块。通过使用函数来组织和模块化代码,可以使其更易读、更易维护且更高效。函数的使用是 C++ 程序组织和代码重用的关键组成部分。

C++ 函数的关键特性

函数有几个关键特性。一些主要的函数特性如下:

1. 声明与定义

函数名称、返回类型以及任何参数都包含在附加到声明函数的签名中。然后,当函数独立定义时,会指定函数的实际实现。

2. 返回类型

函数可以返回给定类型的值。在函数签名中,返回类型在函数名称之前声明。如果函数不返回任何值,则其返回类型被指定为'void'

3. 参数

函数可以接受零个或多个参数,这些参数是提供给函数作为输入的。函数签名包含参数列表,这些参数在函数体中使用。

4. 函数调用

从程序的另一个部分调用函数时,可以使用函数名后跟一对括号;如果函数需要参数,也可以传递它们。

5. 代码组织

函数通过帮助将代码组织成模块化组件来支持结构化且易于理解的代码库。这有助于协作、维护和调试。

语法

它具有以下语法:

return_type: 函数可以返回的值的类型。如果函数不返回任何值,则使用'void'

function_name: 函数的名称。它需要遵循 C++ 的变量命名规则。

parameter_type: 可以输入到函数中的参数的类型。函数可以有零个或多个参数;它们是可选的。

函数体: 它包含定义函数行为的语句。

return 语句: 它不是必需的。它用于返回函数的值。在函数返回类型为'void' 的情况下,可以省略。

函数优点

函数有几个优点。一些主要的函数优点如下:

  1. 代码重用性: 函数通过封装特定功能来鼓励程序中的代码重用。
  2. 抽象: 由于函数提供的抽象级别,程序员可以专注于高级逻辑,而无需担心实现细节。
  3. 可读性和可维护性: 将程序分成函数可以提高代码的可读性,并有助于理解、维护和调试。

示例

让我们看一个例子来说明 C++ 中函数 (function) 的使用

输出

Result of addition: 8

说明

1. 函数声明

函数声明部分定义了函数的名称、参数(此示例中为 int a 和 int b)以及返回类型(此示例中为 int)。

2. 函数定义

此定义描述了函数是如何实现的。它包括函数体,其中执行实际操作。

3. 在此示例中,add 函数计算其参数 (a 和 b) 的总和,并将结果作为一个数字返回。

4. 函数调用

  • 当 main 函数中的 add(3, 5) 函数被调用时,将 3 和 5 这两个值作为参数传递。

5. 结果存储在变量 result 中后,会显示出来。

函数对象 (Functor) 与函数之间的区别

函数对象 (Functor)函数 (Function) 之间有几个区别。一些主要的函数对象和函数之间的区别如下:

1. 灵活性

函数

  • 函数在行为和无状态性方面不够灵活。
  • 与函数对象相比,灵活性受限。

函数对象 (Functor)

  • 函数对象具有内部状态,这使其具有更高的灵活性。
  • 它们足够灵活,可以保存信息并封装特定行为。

2. 调用

函数

通过在函数名后的括号中提供参数来调用函数。

函数对象 (Functor)

通过调用函数对象并提供参数,就像调用函数一样,来调用它。

3. 使用场景

函数

它应用于无状态活动和普通的程序性编程。

函数对象 (Functor)

  • 它通常用于需要可调用实体维护状态和封装行为的场景。
  • 当可调用对象需要在调用之间保留信息时,它很有用,例如在自定义排序算法中。

4. 性质和面向对象方面

函数

  • 传统 C++ 函数使用的编程范式是过程式的。
  • 根据其输入参数,它们充当独立实体。

函数对象 (Functor)

  • 重载 operator() 函数调用运算符的类实例称为函数对象。
  • 由于其面向对象的性质,它们可以像函数一样被调用。

5. 有状态性

函数

函数是无状态的,因为它们的行为完全取决于其输入参数。

函数对象 (Functor)

  • 函数对象能够拥有内部状态,因为它们是类的实例。
  • 函数对象由于这种内部状态,可以在调用之间保留信息。

6. 定制性和灵活性

函数

  • 通常,函数更轻量级且更简单。
  • 它们适用于无状态的标准操作。

函数对象 (Functor)

  • 函数因为是面向对象的,所以提供了更大的灵活性。

由于它们可以包含成员变量和方法,因此允许更多的定制。