关于C++中的函数指针
About Function Pointer in C++
- 这些线的意思相同吗?两者都可以在没有任何警告消息的情况下工作
int (*pFunc)() = func1; // I learned this is right.
int (*pFunc)() = &func1; // Works well with an ampersand too.
- 为什么在这种情况下我必须加一个安培数?没有它,就没用
int (CMyClass::*pMemberFunc)() = &CMyClass::memberFunc1;
- 为什么我必须为类中的函数指定命名空间,即使函数指针的类型完全匹配
int (*pMemberFunc)() = CMyClass::memberFunc1; // Compiler error
int (*pMemberFunc)() = &CMyClass::memberFunc1; // Compiler error
- 为什么在这种情况下我不能指定命名空间
namespace myNamespace {
int func1() {}
}
int (myNamespace::*pFunc)() = myNamespace::func1; // Compiler error
int (myNamespace::*pFunc)() = &myNamespace::func1; // Compiler error
int (*pFunc)() = &myNamespace::func1; // Works!
您的第一个问题,标准的法律术语:
只有当显式&已使用,并且其操作数是未括起来的限定id括号中。[注意:即表达式&(限定id),其中限定id包含在圆括号,不构成"pointer to member"类型的表达式。限定id也不构成,因为从非静态成员函数的限定id到类型"指向成员函数",因为从函数类型的左值到类型"指向函数的指针"(4.3)&不合格id指向成员的指针,即使在不合格id的类的范围内也是如此--尾注]
虽然一开始看起来不一致,但我确实喜欢这样一个事实,即它使指向成员的指针(无论它们是否为函数)的语义等效。这在处理模板和decltype时当然有好处。
对于第二个问题,您使用CMyClass确定指针变量的范围,因为您的函数不是一个简单的"()->int"函数:memberFunc1()隐式传递了一个通常称为"this"的CMyClass*参数。
如果你真的什么都不能传递,那么你就会错过信息(可能会崩溃),让方法正确地完成它的工作。如果你习惯了其他语言中的"委托",请记住,如果方法不是静态/全局的,这些方法可以选择性地存储指向"this"对象的"Target"指针。
至于第三个,它是一个独立的函数,所以它确实是()->int,但您试图将指针的范围限定到命名空间,而实际上您并没有在命名空间块内声明变量。
虽然名称空间肯定会改变搜索符号的方式,但它根本不会影响函数的约定调用。
1)关于Q1,看看下面的代码,因为func1是函数的右值,所以有或没有"&"都不会改变实际的函数地址。查看以下代码:
#include <stdio.h>
void foo(){
printf("foo calledn");
}
int main(){
printf("%pn", foo);
printf("%pn", &foo);
void (*FUNC) ();
FUNC = foo;
FUNC();
printf("address %pn", FUNC);
printf("address %pn", &FUNC);
return 0;
}
输出为
0x101406eb0
0x101406eb0
foo called
address 0x101406eb0
address 0x7fff5e7f9a80
Q2&Q3)指向成员函数的指针不是指针你可以在这里参考https://www.safaribooksonline.com/library/view/c-common-knowledge/0321321928/ch16.html
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针