转换万能法 (类型)变量
class a{};
class b{};
class c : public b{};
void func() { a* a1; b* b1; a1 =(a*) b1; b1 =(b*) a1; } // 编译通过
static_cast<类型> (变量)
静态_转换 ,在编译器编译时进行检测,说白了,是给编译器看的。(当然了 vs 的智能检测,能够在你写代码的时候,提示你,多爽)。
有了万能转换了,为什么还要静态转换??? 搞那么多东西,不烦吗??
万能转换,编译器是 不会检查的(除了 const 转换成非 const 等,那几种特殊情况 )。当然了,写几行test代码,运行了,出问题了,你很快就能找出来了。
但当你面对的是几万行 或者几十万行的代码,出现访问违例还好,若是达不到你预期的结果,你会想到是类型转换出错吗 ??? 慢慢找吧 ^v^
哇 ! 那我以后用 static_cast就够了,编译器就能找到耶。
抱歉,编译器只能找到一部分,只能找到,类型之间有关联的。
比如:
class a{};
class b{};
class c : public b{};
a* a1; b* b1; a1 = static_cast<a*>(b1); //编译出错 b1 = static_cast<b*>a1;//编译出错
b* bb; c* cc; bb = static_cast<b*>(cc); cc = static_cast<c*>(bb); //编译不会出错
你说: double d; char c = static_cast<char> d; 编译也能通过啊,这个,其实,怎么说尼,他们是所有类,数据结构的元数据,就像整数中的0~9 一样,就10个数
字就可以组成整个整数系统,可以表达无穷的整数,就像1怎么转换成5 1+1+1+1+1 = 5 。
对于,常用的类型,如:char,int,float,duoble等,其实编译器是知道他们之间的内部结构,他们之间的转换规则.所以当我们定义一个
类的时候,编译器就会定义他们的内部结构,当你继承一个类的,编译器就会扩展父类的结构,从而知道子类与父类的转换规则,所以当然就可以在编译时知道他们是否
可以转换了,从而通知你,防止你,在没有任何关系的类之间转换。
如果你用万能转换,但你的本意是在 具有父子,孙子,孙孙子,反正就是在一条继承链上 之间的转换,但你却不小心写了一条没有任何关系的类型转换,(代码多了,时间
紧了,什么可能都会出现)。只有在运行时,你才能判段出来,这种bug 你花时间找吧
但如果你用静态_转换。在编译时就能提醒你(vs智能检测,在编写代码时提醒),一旦出现,没有任何关系的类型转换,你就能知道,并解决掉,节省多少时间啊。
什么情况下,使用 static_cast尼? 编译器规定的 基本类型之间(如 char , int 等等) 还有就是 "一条继承链"上的可以"相互转换" 什么是一条链上的尼,比如 没你爷爷,就没有你爸爸,没你爸爸就没有你,这就是一条继承链了,“相互转换” 自己写代码试试 就知道了 多动手,才能理解真理。还有 为什么叫 static 静态尼 ,因为是在编译时期,来提醒你,防止你出现一些没有必要的错的,所以是不会影响性能的,所以养成这种好习惯吧。
const_cast<类型> (变量)
这个其实是方便新手啦,当然 c++也想让新手更容易入门了,比如c++11新特性。
好啦,我们看看,这有什么用。
char* pC = NULL; const char* pcC = (char*) 0x401000; pC = pcC;//编译器不给通过 好吧 来 ! 万能转换法 pC = (char*) pcC;//还是不过啊
在这里,我想起了,有次我去游戏公司面试,面试官说不能转换的,我果断,走了,太垃圾了 这都不懂,还敢当面试官啊 !!!!
来,你可以试试下面的语句。 方案一: pC = *(char**)&pcC; 方案二: _asm{ push eax mov eax, pC mov pcC,eax pop eax }
当然啦,你是新手的话,记住 const_cast<类型>(变量)就行了 pC = const_cast<char*>(pcC); //编译器能通过. 看那个面试官连const_cast都不懂 !!!!
dynamic_cast<类型>(变量)
怎么又多了一个动态转换了尼,卧槽!好烦 ! 我以前就这感觉的。为什么尼? 写的代码少,遇到问题少。你有没有,看到过,什么配骨髓的,除了父母之间,还可以兄弟间转换的。 其实这个比喻不太准确,但我想不到更贴切生活的例子了。