📅  最后修改于: 2023-12-03 14:50:52.248000             🧑  作者: Mango
在 C++ 中,函数也可以像其他数据类型一样作为参数传递给函数。这种特性可以帮助我们实现更灵活的编程模式,如回调函数和函数指针。
函数指针是指向函数的指针变量。通过函数指针,我们可以将函数作为参数传递给其他函数。
定义函数指针的一般格式如下:
return_type (*pointer_name)(argument_types)
示例代码如下:
#include <iostream>
void square(int num) {
std::cout << num * num << std::endl;
}
void cube(int num) {
std::cout << num * num * num << std::endl;
}
void executeFunction(void (*func)(int), int num) {
func(num);
}
int main() {
int num = 5;
executeFunction(square, num);
executeFunction(cube, num);
return 0;
}
上述代码中,我们定义了两个函数 square()
和 cube()
,它们分别计算参数的平方和立方。我们还定义了一个 executeFunction()
函数,该函数以函数指针作为参数,并调用该函数指针所指向的函数。
运行上述代码,输出结果为:
25
125
在 C++11 及更高版本中,我们还可以使用函数对象(即仿函数)来传递函数作为参数。函数对象是一个类对象,它重载了函数调用操作符 operator()
。通过函数对象,我们可以将函数作为参数传递给其他函数。
示例代码如下:
#include <iostream>
struct Square {
void operator()(int num) {
std::cout << num * num << std::endl;
}
};
struct Cube {
void operator()(int num) {
std::cout << num * num * num << std::endl;
}
};
void executeFunction(void (*func)(int), int num) {
func(num);
}
int main() {
int num = 5;
executeFunction(Square(), num);
executeFunction(Cube(), num);
return 0;
}
上述代码中,我们定义了两个函数对象 Square
和 Cube
,它们重载了函数调用操作符 operator()
。我们还定义了一个 executeFunction()
函数,该函数以函数指针作为参数,并调用该函数指针所指向的函数。
运行上述代码,输出结果与前面示例相同。
C++11 还引入了 lambda 表达式,它可以更方便地定义匿名函数,并将其作为参数传递给其他函数。
使用 lambda 表达式时,我们可以直接在函数调用时定义匿名函数。示例代码如下:
#include <iostream>
void executeFunction(void (*func)(int), int num) {
func(num);
}
int main() {
int num = 5;
executeFunction([](int num) {
std::cout << num * num << std::endl;
}, num);
executeFunction([](int num) {
std::cout << num * num * num << std::endl;
}, num);
return 0;
}
上述代码中,我们直接在 executeFunction()
函数调用时使用 lambda 表达式来定义匿名函数,并将其作为参数传递。
运行上述代码,输出结果与前面示例相同。
以上就是在 C++ 中将函数作为参数传递的介绍。函数指针、函数对象和 lambda 表达式都提供了灵活且强大的功能,使得我们能够更加灵活地编写函数式代码。