您的位置:首页 > 编程语言 > C语言/C++

C++ static_cast和dynamic_cast的区别

2015-10-26 11:32 253 查看
网上也看到了一些相关的总结,总觉得他们总结的不太好,还是按照自己的理解写一写吧。

C语言类型转换:

          C语言提供了隐式转换,显示转换。通过这两种方式,C语言中大部分的类型转换都可以顺利进行。至于能不能进行转换,转换后的结果如何,编译器不管,需要用户自己去控制。

C++类型转换:

         C++继承了C中的隐式和显式转换的方式。但这种转换并不是安全和严格的,加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字。(C++是强类型语言)

(static_cast,dynamic_cast,const_static,reinterpret_cast)

         static_cast可以做上述隐式转换的事,可以部分的做显式转换的事,也可以进行继承层次的转换。它没有运行时类型检查来保证转换的安全性。它的上行转换时没问题的,但是它的下行转换时不安全的。

          dynamic_cast几乎唯一的被用来处理多态。多态分为上行转换和下行转换,上行转换没问题,子类的指针肯定可以转换成父类指针。下行转换就有问题了,如果要把父类的指针A转换成子类的指针B,如果A指向的是子类的对象,这样转没问题。但是,如果A指向的是父类的对象,正确的做法是转换应该为不成功的,因为多态里没有子类的指针指向父类的对象的。所以,在“A指向的是父类的对象,现要把A转成B”这种情况下,如果采用static_cast,不会报错,返回的是转换后的指针,但程序此时是不安全的。如果采用dynamic_cast,它会根据虚函数表找到A指向的是什么对象(这里要求父类必须要有虚函数,否则报错),如果是父类对象,返回NULL,如果是子类对象,返回转换后的指针,程序此时是安全的。所以,这就是dynamic_cast和static_cast最大的区别。

          const_cast。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

         reinterpret_cast。这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 类型转换