首先感谢bolow大神在我的博客[C++基础]028_获取类成员函数的指针里提的问题,跟bolow一起探讨得到了下面的答案。
首先看下面的程序:
1 #include <iostream>
2 using namespace std;
3 class A
4 {
5 public:
6 int i;
7 A():i(0){};
8 int foo(){return i;}
9 };
10
11 class B
12 {
13 public:
14 int j,k;
15 B():j(1),k(2){}
16 int foo(){return k;}
17 };
18
19 typedef int (B::*BFPTR)();
20 int main()
21 {
22 int (A::*fptr)()= &A::foo;
23 BFPTR bfptr1=(BFPTR) fptr;
24 B b;
25 A a;
26 cout<<(b.*bfptr1)()<<endl;
27 }
22 int (A::*fptr)()= &A::foo; 将A函数的foo地址给以A为类的一个函数指针
23 BFPTR bfptr1=(BFPTR) fptr; 告诉编译器把上面的函数指针当作B的函数指针来看(A的函数指针转为B的函数指针)
24 B b;
25 A a;
26 cout<<(b.*bfptr1)()<<endl; 执行B的函数指针,其实这时候调用的是A的foo函数输出结果: 1
这里引出一个事实:所谓的类根本就没有成员函数一说,从内存布局上也能看出来,内存布局中只有成员变量的空间,并没有成员函数的内存空间。
这是为什么呢? 那就需要知道成员函数到底是怎么被调用的。
我们看成员函数的调用:对象.成员函数() 或 对象指针->成员函数()
那成员函数实际上是如何被编译器声明的呢? 成员函数(类, 参数) 比如我们有以下的类:
1 class A{
2 public:
3 void foo(int a, int b){
4
5 }
6 private:
7 int value;
8 };
其实上面的类其实是像下面声明的:
1 class A{
2 private:
3 int value;
4 };
5
6 void foo(void *ptr, int a, int b){
7
8 }
当我们调用a.foo(1, 2)时,其实是下面的形式:
1 void foo(void *ptr, int a, int b){...
可见,所谓的.运算符实际是把this指针传递给函数foo了。
那我们最开始的第一个程序里为什么会输出1呢?因为成员函数返回一个成员变量时,只是返回对象的首地址的偏移值。所以,返回了第一个参数1。
如果A类有三个参数,函数foo返回第三个参数时,那输出结果就不是所能预料的了。
原文链接: https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/12/24/2831667.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/73385
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!