博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++基础]044_C++的成员函数本质
阅读量:6122 次
发布时间:2019-06-21

本文共 1294 字,大约阅读时间需要 4 分钟。

首先感谢大神在我的博客里提的问题,跟bolow一起探讨得到了下面的答案。

首先看下面的程序:

1 #include 
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 B12 {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)()<
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)()<

这里引出一个事实:所谓的类根本就没有成员函数一说,从内存布局上也能看出来,内存布局中只有成员变量的空间,并没有成员函数的内存空间。

这是为什么呢? 那就需要知道成员函数到底是怎么被调用的。

我们看成员函数的调用:对象.成员函数() 或 对象指针->成员函数()

那成员函数实际上是如何被编译器声明的呢? 成员函数(类, 参数) 比如我们有以下的类:

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

你可能感兴趣的文章
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
dubbo
查看>>
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>