【C++函数对象和仿函数】
发布人:shili8
发布时间:2024-11-20 22:02
阅读次数:0
**C++函数对象和仿函数**
在C++中,函数对象(Function Object)和仿函数(Functor)是两个相关但不同的概念。它们都允许将函数作为第一类对象来使用,从而使得编程更加灵活和高效。
### 函数对象(Function Object)
函数对象是一种特殊的类型,它可以像普通变量一样被赋值、传递和返回。它通常是通过定义一个类,并在类中重载 `()` 运算符来实现的。这种类称为函数对象,因为它可以像函数一样被调用。
下面是一个简单的例子:
cppclass Add { public: int operator()(int a, int b) const { return a + b; } }; int main() { Add add; std::cout << add(3,4) << std::endl; // 输出:7 return0; }
在这个例子中,我们定义了一个类 `Add`,它有一个重载的 `()` 运算符。这个运算符返回两个整数之和。我们可以创建一个 `Add` 对象,并使用它来计算两个数字的和。
###仿函数(Functor)
仿函数是函数对象的一种特殊形式,它通常不需要任何参数。它也是一种类,重载了 `()` 运算符,但没有任何参数。
下面是一个简单的例子:
cppclass Print { public: void operator()() const { std::cout << "Hello, World!" << std::endl; } }; int main() { Print print; print(); // 输出:Hello, World! return0; }
在这个例子中,我们定义了一个类 `Print`,它有一个重载的 `()` 运算符,但没有任何参数。我们可以创建一个 `Print` 对象,并使用它来输出一条消息。
### std::functionC++11 引入了一种新的类型 `std::function`,它可以存储任何 callable 对象(包括函数、函数对象和仿函数)。这使得编程更加灵活和高效。
下面是一个简单的例子:
cpp#includevoid printHello() { std::cout << "Hello, World!" << std::endl; } int main() { std::function func = printHello; func(); // 输出:Hello, World! return0; }
在这个例子中,我们定义了一个函数 `printHello`,并将它赋值给一个 `std::function` 对象。我们可以使用这个对象来调用 `printHello` 函数。
### std::bindC++11 引入了一种新的函数 `std::bind`,它允许绑定函数的参数,使得编程更加灵活和高效。
下面是一个简单的例子:
cpp#includevoid print(int a, int b) { std::cout << "Hello, World!" << std::endl; } int main() { auto func = std::bind(print,3,4); func(); // 输出:Hello, World! return0; }
在这个例子中,我们定义了一个函数 `print`,并使用 `std::bind` 来绑定它的参数。我们可以使用这个对象来调用 `print` 函数。
### 总结C++中的函数对象和仿函数是两个相关但不同的概念,它们都允许将函数作为第一类对象来使用,从而使得编程更加灵活和高效。函数对象通常是通过定义一个类,并在类中重载 `()` 运算符来实现的,而仿函数则是一种特殊形式的函数对象,它通常不需要任何参数。C++11 引入了一种新的类型 `std::function`,它可以存储任何 callable 对象,从而使得编程更加灵活和高效。最后,C++11 引入了一种新的函数 `std::bind`,它允许绑定函数的参数,使得编程更加灵活和高效。
### 参考* C++ Primer Plus(第5 版)
* Effective C++(第3 版)
* The C++ Programming Language(第4 版)