📅  最后修改于: 2023-12-03 14:59:39.219000             🧑  作者: Mango
在C++中,函数可以作为参数传递给另一个函数。即我们可以将一个函数作为参数,传递给另一个函数,而这个函数接收到这个函数后,就可以像操作普通数据类型一样对此函数进行操作。
其中,我们可以使用C语言的函数作为参数传递给C++代码。
C++语法中,函数作为参数时,需要在函数参数列表中声明参数类型和参数名,如下:
void func(int (*p)(int));
其中,p是一个指向返回类型为int的函数的指针。
我们可以使用如下的代码调用上述函数,并传递一个C函数给它:
int square(int x) { return x * x; }
int main() {
void func(int (*p)(int));
func(square);
return 0;
}
通过将C函数作为参数传递给C++函数,我们可以在C++代码中调用C函数。这在一些需要在C++代码中调用C库函数的场景中很有用。下面是一个使用C函数作为传递参数的示例:
#include <stdio.h>
void foo(void (*bar)(int)) {
bar(10);
}
void bar(int x) {
printf("number is: %d\n", x);
}
int main() {
foo(bar);
return 0;
}
在这个例子中,我们定义了一个foo
函数,它接收一个函数指针bar
作为参数。我们还定义了一个bar
函数,它接收一个int
型参数并打印该参数。
在main
函数中,我们调用foo
函数,并将bar
函数作为参数传递给它。bar
函数在foo
函数内部被调用,并输出number is: 10
。
如果您已经熟悉了C++函数对象,那么您可以将它们作为函数参数传递。函数对象是一个类,其对象可以像函数一样被调用。实际上,许多STL算法需要一个函数对象作为传递参数。
下面是一个简单的示例,演示了如何使用函数对象作为参数:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool isodd(int i) {
return i % 2;
}
class is_less_than {
public:
is_less_than(int x) : m_x(x) {}
bool operator()(int i) const {
return i < m_x;
}
private:
int m_x;
};
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
auto pos = find_if(v.begin(), v.end(), is_odd);
if (pos != v.end()) {
cout << "First odd element found: " << *pos << endl;
}
is_less_than isl(3);
pos = find_if(v.begin(), v.end(), isl);
if (pos != v.end()) {
cout << "First element less than 3 found: " << *pos << endl;
}
return 0;
}
在上面的代码中,我们定义了两个函数对象类is_odd
和is_less_than
。is_odd
返回一个布尔值,表示其参数是否为奇数。is_less_than
下的小于函数,这里使用构造函数来初始化它的参数。
我们使用STL算法find_if
来寻找符合条件的元素,并将我们的函数对象作为传递参数。在第一个调用中,我们使用函数对象is_odd
在向量中查找第一个奇数元素。在第二个调用中,我们使用函数对象is_less_than
在向量中查找第一个小于3的元素。
通过使用C或C++函数作为参数的功能,我们可以编写更加灵活和通用的代码,将基础算法和底层库函数封装到单独的函数中,并将其传递给更高层次的函数进行处理。函数对象提供了更普遍的解决方案,用于设计具有完全通用性的函数。