最近几天在研究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()是可以调用。
希望大虾们继续指点~~