C++成员函数指针与普通函数指针
前两天学习Qt突然发现一个问题,问了好多人都不能解答,给一个老师发邮件居然就给我回复三行!还有一行是“这个作为一个点记住就行了”,还能再敷衍一点吗??看了完全不知所云毫无用处好吗?不懂就直说。。。今天又百度一下终于有所领悟。。
问题是关于函数指针的,我写了个例子代码如下:
(main函数里面 两条语句为一组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class App // App类,包含一个普通成员函数和一个静态函数 { public: int funcc(int a) { cout<<a<<endl; return 2; } static int func2(int a) { cout<<a<<endl; return 3; } }; int func(int a) //普通的全局函数 { cout<<a<<endl; return 1; } int main(int argc,char *argv[]) { int (App::*f)(int); int (*p)(int); // f=App::funcc; //这个不行------------类普通成员函数 f=&App::funcc; //这个行 输出 10 2 App app; // p=func; //这个行 输出 10 1------------普通函数 // p=&func; //这个行 输出 10 1 // p=App::func2; //这个行 输出 10 3-------类静态函数 // p=&App::func2; //这个行 输出 10 3 // cout<<(*p)(10)<<endl; cout<<(app.*f)(10)<<endl; return 0; } |
————————————-分割线————————————-
下面是我的理解:
- 普通函数静态函数 与 成员函数的内存分配是不同的,所以把前两者分为一类。成员函数的指针并不是一个普通的指针,其实现方法见末尾……
- 不论是怎么取函数地址,带上&都是规范写法。
- 编译器支持普通函数和静态函数不带&的写法。
- 有些老的编译器可以通过没有&号的赋值方式,但标准C++强制要求加上&号。—-我想这也是为什么上面不加&会出错了。
下面是两篇干货:
(这一篇比较高深,讲的是成员函数指针编译器的实现。。。我就是随便扫了一眼。。。)