普通函数指针声明需严格匹配函数签名,如int (*ptr)(int, int) = &add;;成员函数须用std::function或静态函数中转;无捕获lambda可转函数指针,有捕获则不可。
怎么声明和获取普通函数的指针
函数指针本质是变量,存储的是函数入口地址。声明时必须严格匹配函数签名(返回类型、参数个数与类型),否则编译失败或运行时崩溃。
比如有函数 int add(int a, int b),对应指针类型是 int (*)(int, int),不是 int (*)() 或 int (*)(int) —— 少一个参数、多一个默认参数、类型不一致都会报错。
- 正确获取方式:
auto ptr = &add;或int (*ptr)(int, int) = &add; -
&符号可省略(C++ 允许函数名自动转为地址),但显式写上更清晰,避免和函数调用混淆 - 不能对重载函数直接取地址,需先用
static_cast明确指定签名:static_cast(add)
如何把成员函数转成可调用对象(非静态)
普通函数指针无法指向非静态成员函数,因为后者隐含 this 参数。直接写 &MyClass::func 得到的是成员函数指针(int (MyClass::*)(int)),类型不同、不能传给只接受 void(*)() 的 C 接口。
常见错误:把 &obj.func 当作函数指针用 —— 这根本不是合法语法,编译不过。
立即学习“C++免费学习笔记(深入)”;