作者james732 (好人超)
看板C_and_CPP
標題Re: [問題] A *a 和 A *a = new A 的疑問
時間Sat Aug 18 00:20:24 2012
這個問題就要先知道 member function 的本質是什麼
事實上,你的 A::test() 經過編譯後,跟底下這個函式是一樣的:
void test(
A *this)
// this 應該用 const 修飾,不過先省略
{
printf("test");
}
然後呼叫
a->test(); 其實就是呼叫 test(
a);
aa->test(); 其實就是呼叫 test(
aa);
傳進去的
a 或
aa,會變成上面紅色的
this,然後根本沒有被使用
因為在 test 裡面,根本沒用到 A 的 member variable
所以 xx->test() 的 xx 不管它是什麼,都不會出問題
因為那個 xx 根本就沒有用到
更極端一點的寫成 ((A *)(0))->test(); 都可以正常執行
但如果像我在推文裡,寫成
void A::test() {printf("test %d", x);}
經過編譯之後,就會變成
void test(A *this) { printf("test %d",
this->x); }
也就是說,a->test() 這個時候的 a 就會變得很重要
因為需要印到 a->x
像 a 有經過 new,指向有效的記憶體空間,那 a->x 會是個合法的存取
但如果 aa 根本沒有 new,它指的空間是無效的,aa->x 就是非法存取了
結論:
如果你 class 的 member function 沒有用到任何 member variable
其實 xx->yy() 那個 xx 就很不重要
就像你原本的 test() 那樣
但只要有用到任何 member variable (絕大部份都會用到吧?)
那麼 xx->yy() 的 xx 就會非常的重要
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.92.122
推 kimmyariel:原來如此!! 感謝james大!!!!!!! 08/18 00:23
推 diabloevagto:果然是好人! 08/18 00:33
→ james732:哇嗚我好久沒在板上發文了 (揮手) 08/18 00:44
推 QQ29:推 不過 傳a 為啥是 test(&a)? 這樣不就變**了嗎 08/18 00:47
哈哈我真的寫錯了耶,感謝提醒
※ 編輯: james732 來自: 114.32.92.122 (08/18 00:50)
→ diabloevagto:Q大真細心xd 08/18 01:10