最近幾天在研究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()是可以調用。
希望大蝦們繼續指點~~