\
匿名函数与函数对象都是 c++++ 中的匿名函数形式,允许创建无名函数。它们具有相似之处:匿名性、函数调用、参数和返回值、捕获能力。实战案例中,lambda 表达式用于向量排序,函数对象用于链表排序。
C++ 匿名函数与函数对象的相似之处
在 C++ 中,匿名函数和函数对象都是匿名函数的形式,没有显式名称。它们本质上非常相似,都允许我们创建一个无名函数,而无需为其指定名称。然而,它们之间也存在一些细微的差别。
Lambda 表达式:匿名函数
立即学习“C++免费学习笔记(深入)”;
Lambda 表达式是一种匿名函数,它使用以下语法定义:
[capture_clause](params) -> return_type { body }
捕获子句允许您指定要从外部范围捕获的变量。
参数列表指定函数的参数。
返回值类型指定函数的返回值类型。
函数体包含函数的主体。
示例:
auto add = [](int a, int b) { return a + b; };
函数对象:类实现的函数
函数对象是实现为类的匿名函数。它们通过 operator() 方法实现匿名函数的功能,如下所示:
class Adder { public: int operator()(int a, int b) { return a + b; } };
示例:
Adder add;
相似之处
匿名性:两者都是匿名函数,不需要指定名称。
函数调用:两者都可以通过函数调用语法调用,就像命名函数一样。
参数和返回值:两者都可以定义参数和返回类型。
捕获能力:两者都支持通过捕获子句或隐式捕获机制从外部作用域捕获变量。
实战案例
// 使用 lambda 表达式排序向量 vectorvec = {1, 3, 5, 2, 4}; sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); // 使用函数对象排序链表 list lst = {1, 3, 5, 2, 4}; lst.sort(Adder());
注意:
Lambda 表达式只能在 C++11 及更高版本中使用,而函数对象可以在更早版本的 C++ 中使用。
函数对象通常比 lambda 表达式更灵活,因为它们可以具有状态和方法。
以上就是C++ 匿名函数与函数对象的相似之处的详细内容,更多请关注本网内其它相关文章!