📜  c 函数作为参数 - C++ (1)

📅  最后修改于: 2023-12-03 14:59:39.219000             🧑  作者: Mango

以'c 函数作为参数 - C++'作主题

简介

在C++中,函数可以作为参数传递给另一个函数。即我们可以将一个函数作为参数,传递给另一个函数,而这个函数接收到这个函数后,就可以像操作普通数据类型一样对此函数进行操作。

其中,我们可以使用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库函数的场景中很有用。下面是一个使用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++ 函数对象作为参数

如果您已经熟悉了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_oddis_less_thanis_odd返回一个布尔值,表示其参数是否为奇数。is_less_than下的小于函数,这里使用构造函数来初始化它的参数。

我们使用STL算法find_if来寻找符合条件的元素,并将我们的函数对象作为传递参数。在第一个调用中,我们使用函数对象is_odd在向量中查找第一个奇数元素。在第二个调用中,我们使用函数对象is_less_than在向量中查找第一个小于3的元素。

总结

通过使用C或C++函数作为参数的功能,我们可以编写更加灵活和通用的代码,将基础算法和底层库函数封装到单独的函数中,并将其传递给更高层次的函数进行处理。函数对象提供了更普遍的解决方案,用于设计具有完全通用性的函数。