Re: [問題] A *a 和 A *a = new A 的疑問

看板C_and_CPP作者 (好人超)時間13年前 (2012/08/17 16:20), 編輯推噓3(302)
留言5則, 4人參與, 最新討論串2/2 (看更多)
這個問題就要先知道 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

08/18 00:23, , 1F
原來如此!! 感謝james大!!!!!!!
08/18 00:23, 1F

08/18 00:33, , 2F
果然是好人!
08/18 00:33, 2F

08/18 00:44, , 3F
哇嗚我好久沒在板上發文了 (揮手)
08/18 00:44, 3F

08/18 00:47, , 4F
推 不過 傳a 為啥是 test(&a)? 這樣不就變**了嗎
08/18 00:47, 4F
哈哈我真的寫錯了耶,感謝提醒 ※ 編輯: james732 來自: 114.32.92.122 (08/18 00:50)

08/18 01:10, , 5F
Q大真細心xd
08/18 01:10, 5F
文章代碼(AID): #1GBczBqy (C_and_CPP)
文章代碼(AID): #1GBczBqy (C_and_CPP)