看板 C_and_CPP 關於我們 聯絡資訊
這個問題就要先知道 member function 的本質是什麼 事實上,你的 A::test() 經過編譯後,跟底下這個函式是一樣的: void test(A *this) // this 應該用 const 修飾,不過先省略 { printf("test"); } 然後呼叫 a->test(); 其實就是呼叫 test(a); aa->test(); 其實就是呼叫 test(aa); 傳進去的 aaa,會變成上面紅色的 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