Re: [問題] 關於Class指標的觀念

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間11年前 (2013/09/07 09:40), 編輯推噓4(4038)
留言42則, 4人參與, 最新討論串14/19 (看更多)
會提出這兩個程式碼是因為我想知道什麼情況 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

09/07 18:21, , 1F
看第一篇還想說怎麼最後一篇會是這個, 原來... LOL
09/07 18:21, 1F

09/07 23:09, , 2F
看完 descent 大大公布輸出結果不知有何感想?
09/07 23:09, 2F

09/07 23:14, , 3F
咦, 我們問的一直都是 G 兄您的感想...
09/07 23:14, 3F

09/07 23:15, , 4F
問 G 兄您在看到這個跟您之前的主張相矛盾的結果的感想...
09/07 23:15, 4F

09/07 23:46, , 5F
此話怎說?為何會覺得我主張相矛盾?
09/07 23:46, 5F

09/08 00:11, , 6F
您主張「指標內容是一個標示記憶體某處位址的整數」對吧?
09/08 00:11, 6F

09/08 00:11, , 7F
那 descent 的結果(或我在前篇推文貼的程式)正反駁了這主張
09/08 00:11, 7F

09/08 00:32, , 8F
我在前面已說過,各位只是看到包裝後的結果,但實際上編譯器
09/08 00:32, 8F

09/08 00:33, , 9F
還是把記憶體位址儲存在指標內,如果您反駁這項理論,那就請
09/08 00:33, 9F

09/08 00:33, , 10F
您說說反對的理由是?
09/08 00:33, 10F

09/08 00:46, , 11F
各位只是看到包裝後的結果,但實際上編譯器還是把整數儲存在
09/08 00:46, 11F

09/08 00:46, , 12F
浮點數內, 如果您反駁這項理論,那就請您說說反對的理由是?
09/08 00:46, 12F

09/08 00:49, , 13F
喔. 我錯了. 不是編譯器!
09/08 00:49, 13F

09/08 00:49, , 14F
我覺得做為一個學術論者,應該有本身的修養才是,而不是把精
09/08 00:49, 14F

09/08 00:50, , 15F
神用在無用的嘴炮上.
09/08 00:50, 15F

09/08 00:51, , 16F
您可以先說說您的理由嗎? 學術論者應該不是說我?
09/08 00:51, 16F

09/08 00:51, , 17F
否則只是在「原地踏步而不知為何其所然」.
09/08 00:51, 17F

09/08 00:51, , 18F
IEEE 754 我想 G 大應該很熟阿?
09/08 00:51, 18F

09/08 00:52, , 19F
若有問題請以「不恥下問」的態度來學習.
09/08 00:52, 19F

09/08 00:53, , 20F
那請問怎樣才叫不恥下問? 我覺得我蠻有禮貌的?
09/08 00:53, 20F

09/08 00:53, , 21F
我很想學習怎麼樣不透過整數去定義浮點數. 您可教教我嗎?
09/08 00:53, 21F

09/08 00:55, , 22F
Feis 大大,您覺得這麼多的問題我應該先回答那一個?
09/08 00:55, 22F

09/08 00:56, , 23F
都可以. 您方便就好! 感謝 :)
09/08 00:56, 23F

09/08 00:57, , 24F
我覺得很奇怪的是,我只是單純的在說明一件事情,但為何會有
09/08 00:57, 24F

09/08 00:58, , 25F
人喜歡用放大鏡做過度的解讀以致於今天這種場面.
09/08 00:58, 25F

09/08 00:59, , 26F
應該是因為你的說明很有趣阿. 跟我們認知的有些差異
09/08 00:59, 26F

09/08 01:00, , 27F
G 大的意思如果只是說指標裡面通常會包含記憶體位址
09/08 01:00, 27F

09/08 01:01, , 28F
應該跟我認知就比較像?
09/08 01:01, 28F

09/08 01:01, , 29F
呵呵~或許是吧.
09/08 01:01, 29F

09/08 01:03, , 30F
只是 G 大喜歡使用 "一定" 這個字眼, 大家當然後有放大效果
09/08 01:03, 30F

09/08 01:04, , 31F
您剛問「不透過整數去定義浮點數」,這個論點是您個人?
09/08 01:04, 31F

09/08 01:05, , 32F
我是想表達浮點數格式通常也是包含整數
09/08 01:05, 32F

09/08 01:06, , 33F
但是我們不會說浮點數就是整數這種話~
09/08 01:06, 33F

09/08 01:07, , 34F
那您的問題跟想表達的事情是兩回事吧
09/08 01:07, 34F

09/08 01:08, , 35F
怎麼說? 那 G 大覺得指標跟整數的關係是?
09/08 01:08, 35F

09/08 01:08, , 36F
「浮點數就是整數」這句話有誰說過?
09/08 01:08, 36F

09/08 01:10, , 37F
第一個,您的問題答案是沒人有這種論點而且我也不知道為何您
09/08 01:10, 37F

09/08 01:11, , 38F
會有這個問題,第二,浮點數格式跟整數格式是不相同的.
09/08 01:11, 38F

09/08 01:13, , 39F
F 大,您即然否定「一定」這個定義,那您可說說指標在正常的
09/08 01:13, 39F

09/08 01:14, , 40F
使用下除了記憶體位址以外還能夠存什麼呢?
09/08 01:14, 40F

09/08 02:20, , 41F
第二: 我們常用的浮點數格式是用整數格式定義來的.
09/08 02:20, 41F

09/08 02:21, , 42F
G 大. 這篇的主題就是在講這個~ 晚安!
09/08 02:21, 42F
※ 編輯: descent 來自: 59.125.239.46 (09/11 08:23)
文章代碼(AID): #1IAeGUIV (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1IAeGUIV (C_and_CPP)