在 C++ 中,函数指针是一种指向函数的指针变量,可以用于调用函数或作为回调函数传递。以下是函数指针的详细写法及用法:
- 函数指针的基本声明
函数指针的声明方式与函数声明类似,但需要将指针名放在*后面,并用括号包裹:
语法
【cpp】
返回类型 (*指针变量名)(参数类型1, 参数类型2, ...);
示例
【cpp】
// 定义一个普通函数
int add(int a, int b) {
return a + b;
}
// 声明一个函数指针,指向返回 int 并接受两个 int 参数的函数
int (*funcPtr)(int, int);
// 将函数地址赋值给指针
funcPtr = add;
// 通过函数指针调用函数
int result = funcPtr(3, 4); // 调用 add(3, 4),result = 7
- 函数指针作为参数
函数指针可以像普通变量一样作为函数参数传递,常用于回调机制。
示例
【cpp】
#include
void printHello() {
std::cout << "Hello, World!" << std::endl;
}
void printGoodbye() {
std::cout << "Goodbye!" << std::endl;
}
// 接受一个无参数、无返回值的函数指针
void callFunction(void (*func)()) {
func(); // 调用传入的函数
}
int main() {
callFunction(printHello); // 输出 "Hello, World!"
callFunction(printGoodbye); // 输出 "Goodbye!"
return 0;
}
- 函数指针数组
可以定义一个函数指针数组,用于存储多个函数指针。
示例
【cpp】
#include
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int main() {
// 定义函数指针数组
int (*operations[])(int, int) = {add, sub, mul};
int x = 10, y = 5;
// 调用不同的函数
std::cout << operations[0](x, y) << std::endl; // add(10, 5) = 15
std::cout << operations[1](x, y) << std::endl; // sub(10, 5) = 5
std::cout << operations[2](x, y) << std::endl; // mul(10, 5) = 50
return 0;
}
4.typedef或using简化函数指针类型
为了简化复杂的函数指针声明,可以使用typedef或using定义别名。
方法 1:typedef
【cpp】
typedef int (*MathFunc)(int, int); // 定义函数指针类型
int add(int a, int b) { return a + b; }
int main() {
MathFunc func = add; // 使用别名声明函数指针
std::cout << func(3, 4) << std::endl; // 输出 7
return 0;
}
方法 2:using(C++11 推荐)
【cpp】
using MathFunc = int (*)(int, int); // 定义函数指针类型
int add(int a, int b) { return a + b; }
int main() {
MathFunc func = add; // 使用别名声明函数指针
std::cout << func(3, 4) << std::endl; // 输出 7
return 0;
}
- 函数指针与std::function(C++11 推荐)
C++11 引入了std::function,它可以存储任意可调用对象(函数、Lambda、函数对象等),比传统函数指针更灵活。
示例
【cpp】
#include
#include // 需要包含头文件
int add(int a, int b) { return a + b; }
int main() {
// 使用 std::function 存储函数指针
std::function<int(int, int)> func = add;
std::cout << func(3, 4) << std::endl; // 输出 7
// 也可以存储 Lambda
std::function<int(int, int)> lambdaFunc = [](int a, int b) { return a * b; };
std::cout << lambdaFunc(3, 4) << std::endl; // 输出 12
return 0;
}
- 成员函数指针
成员函数指针的声明方式与普通函数指针不同,需要指定类名。
示例
【cpp】
#include
class MyClass {
public:
void printMessage() {
std::cout << "Hello from MyClass!" << std::endl;
}
};
int main() {
// 声明成员函数指针
void (MyClass::*memberFuncPtr)() = &MyClass::printMessage;
MyClass obj;
// 调用成员函数指针
(obj.*memberFuncPtr)(); // 输出 "Hello from MyClass!"
return 0;
}
总结
【表格】
场景 写法
普通函数指针 int (*funcPtr)(int, int) = add;
函数指针作为参数 void callFunc(void (*func)()) { func(); }
函数指针数组 int (*ops[])(int, int) = {add, sub, mul};
typedef 简化 typedef int (MathFunc)(int, int);
using 简化(C++11) using MathFunc = int ( )(int, int);
std::function(C++11) std::function<int(int, int)> func = add;
成员函数指针 void (MyClass::*memberFuncPtr)() = &MyClass::printMessage;
推荐
• 优先使用std::function(C++11+),因为它更灵活,支持 Lambda 和函数对象。
• 在 C 风格代码或旧版 C++ 中,可以使用传统函数指针。
• 成员函数指针语法较复杂,建议用std::function替代。
希望这个总结对你有帮助! 😊