作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] 關於Class指標的觀念
時間Sat Sep 7 09:40:40 2013
會提出這兩個程式碼是因為我想知道什麼情況
member function pointer 的這兩部份會改變,
再猜了很多情形後, 這兩個程式碼可以感受到這個變化。
簡單提一下就好:
void (A::*p)() = &A::abc;
80486b6: c7 44 24 18 05 00 00 movl $0x5,0x18(%esp)
80486bd: 00
80486be: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
80486c5: 00
抱歉, 我貼錯了
這才是我指的第二部份
void (AB::*p)() = &B::ff;
8048736: c7 44 24 28 01 00 00 movl $0x1,0x28(%esp)
804873d: 00
804873e: c7 44 24 2c 08 00 00 movl $0x8,0x2c(%esp)
8048745: 00
--------------------------- 原文 (非我本意) ---------------------------------
void (A::*p)() = &A::abc;
8048646: c7 44 24 18 e2 86 04 movl $0x80486e2,0x18(%esp)
804864d: 08
804864e: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
8048655: 00
---------------------------------------------------------------------
所以在不同情況下, member function pointer 這兩個部份改變也有所不同,
只是我覺得沒完沒了, 所以到此先打住。我可不想玩排列組合。
加上之前的例子, 這樣應該足夠看出
member function pointer 和一般 function pointer 的不同之處。
C 應該沒有類似的東西, C 指標應該很單純就指向某個記憶體位址。
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: 這會影響 member function pointer 第一部份。
: 1 #include <iostream>
: 2 #include <cstdio>
: 3
: 4 using namespace std;
: 5
: 6 struct A
: 7 {
: 8 virtual void func()
: 9 {
: 10 printf("i: %d\n", i_);
: 11 }
: 12 virtual void abc()
: 13 {
: 14 printf("abc i: %d\n", i_);
: 15 }
: 16 A()
: 17 {
: 18 i_=10;
: 19 }
: 20 private:
: 21 int i_;
: 22 };
: 23
: 24
: 25 int main()
: 26 {
: 27 void (A::*p)() = &A::abc;
: 28 A a;
: 29 (a.*p)();
: 30
: 31 return 0;
: 32 }
: member function pointer 的第二部份
: 1 #include <iostream>
: 2 #include <cstdio>
: 3
: 4 using namespace std;
: 5
: 6 struct A
: 7 {
: 8 virtual void func()
: 9 {
: 10 printf("i: %d\n", i_);
: 11 }
: 12 A()
: 13 {
: 14 i_=10;
: 15 }
: 16 private:
: 17 int i_;
: 18 };
: 19
: 20 struct B
: 21 {
: 22 virtual void ff()
: 23 {
: 24 printf("i: %d\n", i_);
: 25 }
: 26 B()
: 27 {
: 28 i_=10;
: 29 }
: 30 private:
: 31 int i_;
: 32 };
: 33
: 34 struct AB : public A, public B
: 35 {
: 36 virtual void func()
: 37 {
: 38 printf("i am ab\n");
: 39 }
: 40 virtual void ff()
: 41 {
: 42 printf("i am ab ff\n");
: 43 }
: 44 };
: 45
: 46 int main()
: 47 {
: 48 void (AB::*p)() = &B::ff;
: 49 AB ab;
: 50 (ab.*p)();
: 51
: 52 return 0;
: 53 }
: 有點沒完沒了的感覺, 就此先打住, 讓有興趣的人研究。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.139.183
推 Ebergies:看第一篇還想說怎麼最後一篇會是這個, 原來... LOL 09/07 18:21
→ GNUGCC:看完 descent 大大公布輸出結果不知有何感想? 09/07 23:09
推 LPH66:咦, 我們問的一直都是 G 兄您的感想... 09/07 23:14
→ LPH66:問 G 兄您在看到這個跟您之前的主張相矛盾的結果的感想... 09/07 23:15
→ GNUGCC:此話怎說?為何會覺得我主張相矛盾? 09/07 23:46
推 LPH66:您主張「指標內容是一個標示記憶體某處位址的整數」對吧? 09/08 00:11
→ LPH66:那 descent 的結果(或我在前篇推文貼的程式)正反駁了這主張 09/08 00:11
→ GNUGCC:我在前面已說過,各位只是看到包裝後的結果,但實際上編譯器 09/08 00:32
→ GNUGCC:還是把記憶體位址儲存在指標內,如果您反駁這項理論,那就請 09/08 00:33
→ GNUGCC:您說說反對的理由是? 09/08 00:33
→ Feis:各位只是看到包裝後的結果,但實際上編譯器還是把整數儲存在 09/08 00:46
→ Feis:浮點數內, 如果您反駁這項理論,那就請您說說反對的理由是? 09/08 00:46
→ Feis:喔. 我錯了. 不是編譯器! 09/08 00:49
→ GNUGCC:我覺得做為一個學術論者,應該有本身的修養才是,而不是把精 09/08 00:49
→ GNUGCC:神用在無用的嘴炮上. 09/08 00:50
→ Feis:您可以先說說您的理由嗎? 學術論者應該不是說我? 09/08 00:51
→ GNUGCC:否則只是在「原地踏步而不知為何其所然」. 09/08 00:51
→ Feis:IEEE 754 我想 G 大應該很熟阿? 09/08 00:51
→ GNUGCC:若有問題請以「不恥下問」的態度來學習. 09/08 00:52
→ Feis:那請問怎樣才叫不恥下問? 我覺得我蠻有禮貌的? 09/08 00:53
→ Feis:我很想學習怎麼樣不透過整數去定義浮點數. 您可教教我嗎? 09/08 00:53
→ GNUGCC:Feis 大大,您覺得這麼多的問題我應該先回答那一個? 09/08 00:55
→ Feis:都可以. 您方便就好! 感謝 :) 09/08 00:56
→ GNUGCC:我覺得很奇怪的是,我只是單純的在說明一件事情,但為何會有 09/08 00:57
→ GNUGCC:人喜歡用放大鏡做過度的解讀以致於今天這種場面. 09/08 00:58
→ Feis:應該是因為你的說明很有趣阿. 跟我們認知的有些差異 09/08 00:59
→ Feis:G 大的意思如果只是說指標裡面通常會包含記憶體位址 09/08 01:00
→ Feis:應該跟我認知就比較像? 09/08 01:01
推 GNUGCC:呵呵~或許是吧. 09/08 01:01
→ Feis:只是 G 大喜歡使用 "一定" 這個字眼, 大家當然後有放大效果 09/08 01:03
→ GNUGCC:您剛問「不透過整數去定義浮點數」,這個論點是您個人? 09/08 01:04
→ Feis:我是想表達浮點數格式通常也是包含整數 09/08 01:05
→ Feis:但是我們不會說浮點數就是整數這種話~ 09/08 01:06
→ GNUGCC:那您的問題跟想表達的事情是兩回事吧 09/08 01:07
→ Feis:怎麼說? 那 G 大覺得指標跟整數的關係是? 09/08 01:08
→ GNUGCC:「浮點數就是整數」這句話有誰說過? 09/08 01:08
→ GNUGCC:第一個,您的問題答案是沒人有這種論點而且我也不知道為何您 09/08 01:10
→ GNUGCC:會有這個問題,第二,浮點數格式跟整數格式是不相同的. 09/08 01:11
→ GNUGCC:F 大,您即然否定「一定」這個定義,那您可說說指標在正常的 09/08 01:13
→ GNUGCC:使用下除了記憶體位址以外還能夠存什麼呢? 09/08 01:14
→ Feis:第二: 我們常用的浮點數格式是用整數格式定義來的. 09/08 02:20
→ Feis:G 大. 這篇的主題就是在講這個~ 晚安! 09/08 02:21
※ 編輯: descent 來自: 59.125.239.46 (09/11 08:23)