看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 今天幫同學debug : 自己寫了些測試程式如下 : http://nopaste.info/8fabb7f59c.html : 這段測試code主要有兩個問題 : GO((GG)(&A<int>::XD)); : 這行 (GG) 我是對他做轉型 : 1. 為啥他印出來不是印5 而是奇怪數字 不是應該有預設=5嘛 轉型後的function pointer type是 void (*) () 這裡面沒有任何default argument 事實上C++ standard也不允許在function pointer type裡出現default argument 當此函式被呼叫時不會傳入任何參數 所以A::XD()在執行時的第一個參數是stack的殘骸 : 2. 如果不透過typedef 但我又想對他做轉型 我該怎麼寫 語法不太了解 (void (*) ()) : 3. 因為是看到別人的Code 有對傳入的function 做轉型的動作 : 請問這個是不是有什麼特殊用法或技巧??? : 於是乎我就改成以下這樣... : http://nopaste.info/11076af302.html : 我硬把他轉型多了一個int 可以傳 : 於是乎呼叫了XD 且傳入一個int : compile沒有錯誤 請問道理何在... 反倒是少傳了int就會compile error comiple time只管你的型別 你既然強制轉型成吃一個int的function 當然要傳一個int給它 以上面那個有default argument的XD來說 你也可以這樣惡搞: ((void (*) (int, int))&A<int>::XD)(100, 0); 印出來的結果就是100.. 反正強制轉型就是不管你指標指的是什麼東西 一律換成轉型後的指標就對了 你高興的話也可以寫出下面這種code class A () { int data; }; class B () { }; B* b = new B(); cout << ((A*)b)->data << endl; 當然這樣在run time會產生的問題 就是寫出這種不安全轉型的programmer的責任啦 : 以上 : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.15.163
QQ29:謝謝你 那我想藉此問一下 C-style強轉和C++的static_cast 10/13 11:38
QQ29:差別在哪裡呀 因為我對static_cast的能力一直不是很清楚 10/13 11:39
QQ29:C-style轉型似乎是無敵寫對type compile都不會error 10/13 11:40
QQ29:static_cast好像就不是這樣 爬文好像也沒特別討論...謝謝 10/13 11:40
tyc5116:書上寫,一個是強轉,但是是用哪種方式轉型不得而知 10/13 12:48
tyc5116:static_cast則指明了是用靜態轉型~ 10/13 12:49
QQ29:但是有什麼限制呢? 所謂靜態是指什麼@@ 10/13 14:03
QQ29:我會這樣問是常看到的都是合理的轉型用static_cast... 10/13 14:10
QQ29:但不知道他和其他三種c++轉型法 尤其是reinterpret cast差異 10/13 14:11
tyc5116:static似乎不能作指標的轉換,要用reinterpret的樣子 10/13 15:17
QQ29:假如我寫float *f; int *p=static_cast<void*>(f); 10/13 15:27
QQ29:compile就直接有error 這就是static_cast要達到的目的嘛? 10/13 15:27
QQ29:如果要強轉c++就必須要用reinterpret?? 10/13 15:27
tyc5116:(以下是猜的),應該是,強轉有時候在compile的時候會過,但是 10/13 15:32
tyc5116:在執行的時候才顯示出錯誤(忘了是啥錯誤訊息了,有過遇一次 10/13 15:33
QQ29:我好像打錯了改成int *p = static_cast<int*> ( f ); 10/13 15:37
QQ29:這樣不給過@@ 用void*可給過 實在不懂static_cast用意 10/13 15:38
QQ29:只是希望compile時能夠讓避免無腦的c style轉型讓程式壞嘛? 10/13 15:38
tyc5116:因為void*本身就定義成可轉成所有型態的指標啊 10/13 15:51
tyc5116:所以才會例外吧...當然還是我猜的啦....XD 10/13 15:52
QQ29:嗯是~~只是我想知道static的能力跟他的用法 在哪邊必須用他@@ 10/13 15:55
littleshan:請看 Effective C++ 10/13 17:21