最近幾天在研究boost庫,當看到addressof()函數(shù)時,碰到一個問題:
當重載operator&時,它的語義肯定會與大多數(shù)用戶所期望的不同,即函數(shù)返回的可能不是用戶所期望的地址值。比如下面的例子:
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;
}
但令我奇怪的是,上面的程序竟然能順利運行!因為我在單步運行的時候,發(fā)現(xiàn)p的值時0x00000000。
p不是空指針嗎?但它卻能調用test()。
經(jīng)過幾日的思考,加上幾位高人的指點。我敘述一下原因:
類A的test函數(shù)地址跟成員變量并不是連續(xù)存放在一個內存空間里。test函數(shù)在在編譯main函數(shù)的實現(xiàn)文件編譯的時候
test函數(shù)已經(jīng)在main函數(shù)obj文件生成了!所以,只要確定了p指向的類型,就可以調用test(),還有另外一個原因就是test()
test()沒有調用類A的成員變量,所以p->test()是可以調用。
希望大蝦們繼續(xù)指點~~