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