0$房天下问答|c++高手请解答小弟疑惑$https://m.fang.com/ask/ask_1797455.html$https://static.soufunimg.com/common_m/m_public/201511/images/asksharedefault.png
packc/pages/ask/detail/detail?askid=1797455
-
c++高手请解答小弟疑惑
#include <iostream.h>class Sample{ int x,y;public: Sample(int a,int b){ x=a; y=b; } int getx(){return x;} int gety(){return y;}};void main(){ int (Sample::*fp)(); fp=&Sample::getx; //语句1 Sample s(2,7); int v=(s.*fp)(); cout<<v;}请问,类在创建对象以前不是不分配内存吗,怎么语句1可以得到函数getx的地址呢?
更多
共1个回答
-
-
-
batimc2008
丨Lv 0
你说得对,类在创建对象以前是不分配内存的,所以语句1不可能得到getx的实例地址,因为这个时候实例不存在(实例可以理解为该类的对象,注意一个类可以有多个实例同时存在,这要看具体应用)。语句1实际上是一个函数指针,&Sample::getx得到的是getx函数相对于Sample的偏移地址。偏移地址编译时是可以计算出来的。函数的偏移量是固定的,所以fp这个函数指针指向任何Sample类的实例都代表getx这个函数位置。例如:你的程序除有Sample s(2,7); 还有Sample s2(3,8);Sample s3(4,9)等。那么s2.(*fp)(); s3.(*fp)(); 都是调用各自对象的getx,所以楼上说“无论创建多少对象,这个函数的地址都只有一个”是错的(除非是类的静态成员函数)!做个实验就可以知道对象有各自的内存空间:Sample* p1,p2;//对象指针Sample s(2,7);// 实例化一个对象Sample s2(3,8);// 再实例化一个对象p1 = &s; // 取对象一的地址p2 = &s2;// 取对象二的地址比较p1和p2的值发现p1不等于p2,那么就是说Sample的对象s和s2在不同的内存空间。他们的getx函数分别位于p1+getx偏移和p2+getx偏移.
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。

关注成功