最近几天在研究boost库,当看到addressof()函数时,碰到一个问题:
当重载operator&时,它的语义肯定会与大多数用户所期望的不同,即函数返回的可能不是用户所期望的地址值。比如下面的例子:
class A
{
public:
 void test()
 {
  std::cout<<"easy"<<std::endl;
 }
 A* operator& ()const
 {
  return 0;
 }
};

int main()
{
 
   A a;
   A *p;
   p = &a;
   p->test();
   system("pause");
   return 0;
}

但令我奇怪的是,上面的程序竟然能顺利运行!因为我在单步运行的时候,发现p的值时0x00000000。
p不是空指针吗?但它却能调用test()。
经过几日的思考,加上几位高人的指点。我叙述一下原因:
类A的test函数地址跟成员变量并不是连续存放在一个内存空间里。test函数在在编译main函数的实现文件编译的时候
test函数已经在main函数obj文件生成了!所以,只要确定了p指向的类型,就可以调用test(),还有另外一个原因就是test()
test()没有调用类A的成员变量,所以p->test()是可以调用。

希望大虾们继续指点~~