static_cast const_cast dynamic_cast

转换万能法   (类型)变量
                    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<类型>(变量) 
                 怎么又多了一个动态转换了尼,卧槽!好烦 !  我以前就这感觉的。为什么尼? 写的代码少,遇到问题少。你有没有,看到过,什么配骨髓的,除了父母之间,还可以兄弟间转换的。 其实这个比喻不太准确,但我想不到更贴切生活的例子了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值