房天下 > 房天下问答 > 业主生活 > 其他
  • 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的地址呢?

    提问者:在线明智

    发布于2011-01-17

共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偏移.
    +1 2011-01-18 举报
热门人气推荐
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。