Re: [問題] function pointer及一些語法問題

看板C_and_CPP (C/C++)作者時間16年前 (2009/10/13 10:26), 編輯推噓10(10012)
留言22則, 3人參與, 最新討論串2/3 (看更多)
※ 引述《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

10/13 11:38, , 1F
謝謝你 那我想藉此問一下 C-style強轉和C++的static_cast
10/13 11:38, 1F

10/13 11:39, , 2F
差別在哪裡呀 因為我對static_cast的能力一直不是很清楚
10/13 11:39, 2F

10/13 11:40, , 3F
C-style轉型似乎是無敵寫對type compile都不會error
10/13 11:40, 3F

10/13 11:40, , 4F
static_cast好像就不是這樣 爬文好像也沒特別討論...謝謝
10/13 11:40, 4F

10/13 12:48, , 5F
書上寫,一個是強轉,但是是用哪種方式轉型不得而知
10/13 12:48, 5F

10/13 12:49, , 6F
static_cast則指明了是用靜態轉型~
10/13 12:49, 6F

10/13 14:03, , 7F
但是有什麼限制呢? 所謂靜態是指什麼@@
10/13 14:03, 7F

10/13 14:10, , 8F
我會這樣問是常看到的都是合理的轉型用static_cast...
10/13 14:10, 8F

10/13 14:11, , 9F
但不知道他和其他三種c++轉型法 尤其是reinterpret cast差異
10/13 14:11, 9F

10/13 15:17, , 10F
static似乎不能作指標的轉換,要用reinterpret的樣子
10/13 15:17, 10F

10/13 15:27, , 11F
假如我寫float *f; int *p=static_cast<void*>(f);
10/13 15:27, 11F

10/13 15:27, , 12F
compile就直接有error 這就是static_cast要達到的目的嘛?
10/13 15:27, 12F

10/13 15:27, , 13F
如果要強轉c++就必須要用reinterpret??
10/13 15:27, 13F

10/13 15:32, , 14F
(以下是猜的),應該是,強轉有時候在compile的時候會過,但是
10/13 15:32, 14F

10/13 15:33, , 15F
在執行的時候才顯示出錯誤(忘了是啥錯誤訊息了,有過遇一次
10/13 15:33, 15F

10/13 15:37, , 16F
我好像打錯了改成int *p = static_cast<int*> ( f );
10/13 15:37, 16F

10/13 15:38, , 17F
這樣不給過@@ 用void*可給過 實在不懂static_cast用意
10/13 15:38, 17F

10/13 15:38, , 18F
只是希望compile時能夠讓避免無腦的c style轉型讓程式壞嘛?
10/13 15:38, 18F

10/13 15:51, , 19F
因為void*本身就定義成可轉成所有型態的指標啊
10/13 15:51, 19F

10/13 15:52, , 20F
所以才會例外吧...當然還是我猜的啦....XD
10/13 15:52, 20F

10/13 15:55, , 21F
嗯是~~只是我想知道static的能力跟他的用法 在哪邊必須用他@@
10/13 15:55, 21F

10/13 17:21, , 22F
請看 Effective C++
10/13 17:21, 22F
文章代碼(AID): #1Aq-LPn2 (C_and_CPP)
文章代碼(AID): #1Aq-LPn2 (C_and_CPP)