作者holymars ()
看板C_and_CPP
标题Re: [问题] function pointer及一些语法问题
时间Tue Oct 13 10:26:29 2009
※ 引述《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
1F:推 QQ29:谢谢你 那我想藉此问一下 C-style强转和C++的static_cast 10/13 11:38
2F:→ QQ29:差别在哪里呀 因为我对static_cast的能力一直不是很清楚 10/13 11:39
3F:→ QQ29:C-style转型似乎是无敌写对type compile都不会error 10/13 11:40
4F:→ QQ29:static_cast好像就不是这样 爬文好像也没特别讨论...谢谢 10/13 11:40
5F:推 tyc5116:书上写,一个是强转,但是是用哪种方式转型不得而知 10/13 12:48
6F:→ tyc5116:static_cast则指明了是用静态转型~ 10/13 12:49
7F:推 QQ29:但是有什麽限制呢? 所谓静态是指什麽@@ 10/13 14:03
8F:→ QQ29:我会这样问是常看到的都是合理的转型用static_cast... 10/13 14:10
9F:→ QQ29:但不知道他和其他三种c++转型法 尤其是reinterpret cast差异 10/13 14:11
10F:推 tyc5116:static似乎不能作指标的转换,要用reinterpret的样子 10/13 15:17
11F:推 QQ29:假如我写float *f; int *p=static_cast<void*>(f); 10/13 15:27
12F:→ QQ29:compile就直接有error 这就是static_cast要达到的目的嘛? 10/13 15:27
13F:→ QQ29:如果要强转c++就必须要用reinterpret?? 10/13 15:27
14F:推 tyc5116:(以下是猜的),应该是,强转有时候在compile的时候会过,但是 10/13 15:32
15F:→ tyc5116:在执行的时候才显示出错误(忘了是啥错误讯息了,有过遇一次 10/13 15:33
16F:推 QQ29:我好像打错了改成int *p = static_cast<int*> ( f ); 10/13 15:37
17F:→ QQ29:这样不给过@@ 用void*可给过 实在不懂static_cast用意 10/13 15:38
18F:→ QQ29:只是希望compile时能够让避免无脑的c style转型让程式坏嘛? 10/13 15:38
19F:推 tyc5116:因为void*本身就定义成可转成所有型态的指标啊 10/13 15:51
20F:→ tyc5116:所以才会例外吧...当然还是我猜的啦....XD 10/13 15:52
21F:推 QQ29:嗯是~~只是我想知道static的能力跟他的用法 在哪边必须用他@@ 10/13 15:55
22F:推 littleshan:请看 Effective C++ 10/13 17:21