就两个字:别用。如果一定要类型转换呢?那就用c-style的cast吧。如果你只是想看使用方法,看到这就可以了。下面是说明。
c++圣经《TC++PL》说使用c++四种cast比c-style的cast更安全。其实我觉得没多大差别。想象下:你正在用明火焊接一个充满C4炸弹的鱼雷(类型转换危险但是又必要),这时候你是否叼着烟其实对你能否survive影响不大,细心谨慎+拜拜大神才是正道。
具体分析:
const_cast,用于把const类型转换成对应非const类型,问题来了,你为啥这么做?告诉大家骗子很多不要轻信他人?如果发现需要用const_cast的情况一般是正在写一个函数A,入参是const,但需要调用非const入参的函数B。仔细分析一番:1)B不符合const入参语义,显然A的入参有误,改成非const入参;2)B可以修改且其符合const入参语义,这种情况以其用const_cast,不如把B的入参加上const修饰;3)B不能修改且其符合const入参语义,这种情况下似乎必须用const_cast了,但这种情况下B一般是由其他库提供,去假定其他库的实现(说不定其他库会升级)并不是个好主意,建议顺序:修改A入参->使用复制的入参调用B->const_cast。
reinpreter_cast,这玩意和c-style cast没有任何区别。
static_cast,类似带编译时检验的c-style
cast,编译器隐式执行的任何类型转换都可由static_cast显示完成。所以的确比c-style
cast安全一点,效率上也没差别。但如果以为static_cast就是安全的转换则大谬,这个只能由程序员来保证。
dynamic_cast,用在父类与子类指针间互相转换,被认为是最安全也最昂贵的转换,进行类型检查,转换失败时返回NULL。问题是设计良好的OO代码不会逼着人做这种事情,我还没见过正经OO代码不得不用它的,多态才是正常做法。