C++中将函数指针声明为类属性的方法及不同写法的差异
两种声明的核心区别
本质是C/C++声明规则中优先级绑定的差异,括号的作用范围不同直接决定了标识符的类型:
- 对于
void *(func)():
括号仅包裹标识符func本身,不会改变声明优先级,func会优先和后置的()绑定,代表它是一个函数,函数的返回值类型为void*(空类型指针)。这种写法和void* func()完全等价,本质是函数声明,而非函数指针变量声明,自然无法给它赋值其他函数地址。 - 对于
void (*func)():
括号包裹了*func整体,强制调整优先级,让func先和*绑定,代表它是一个指针,再和后置的()绑定,说明这个指针指向的是一个函数,该函数的返回值为void(无返回值),这才是标准的无参无返回值函数指针声明,支持后续赋值其他同类型函数的地址。
避坑提示
如果担心写混函数指针,可以用类型别名简化声明:
C++11及以上版本推荐用using:
using VoidFuncPtr = void (*)(); // 后续直接用别名定义变量,不会出错 VoidFuncPtr func;
低版本C++也可以用typedef:
typedef void (*VoidFuncPtr)(); VoidFuncPtr func;
内容的提问来源于stack exchange,提问作者Vitagor
相关产品推荐
相关产品推荐

