关于C++中的函数指针

About Function Pointer in C++

本文关键字:函数 指针 C++ 关于      更新时间:2023-10-16
  1. 这些线的意思相同吗?两者都可以在没有任何警告消息的情况下工作

int (*pFunc)() = func1;     // I learned this is right.
int (*pFunc)() = &func1;        // Works well with an ampersand too.
  1. 为什么在这种情况下我必须加一个安培数?没有它,就没用

int (CMyClass::*pMemberFunc)() = &CMyClass::memberFunc1;
  1. 为什么我必须为类中的函数指定命名空间,即使函数指针的类型完全匹配

int (*pMemberFunc)() = CMyClass::memberFunc1;       // Compiler error
int (*pMemberFunc)() = &CMyClass::memberFunc1;      // Compiler error
  1. 为什么在这种情况下我不能指定命名空间

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