Re: [問題] A *a 和 A *a = new A 的疑問
這個問題就要先知道 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
推
08/18 00:23, , 1F
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
08/18 00:47, 4F
哈哈我真的寫錯了耶,感謝提醒
※ 編輯: james732 來自: 114.32.92.122 (08/18 00:50)
→
08/18 01:10, , 5F
08/18 01:10, 5F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):