💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[C++为什么非要引入那几种类型转换?](https://mp.weixin.qq.com/s/6YW7VX787X7kZiRBLbVn-Q) ***** 众所周知C++关于类型转换引入了**四种**方式: static\_cast const\_cast dynamic\_cast reinterpret\_cast 1. 为什么要引入这几种类型转换,它与C语言中的强制类型转换有什么区别? 2. 这四种类型转换分别应用在什么场景? ## C++为什么要引入这几种强制类型转换? 我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很容易出bug,需要严格审查代码才能消除这种隐患,但是C这种转换方式不利于我们审查代码,且程序运行时也可能会出bug。 而C++引入的这几种类型转换可以完美的解决上述问题,不同场景下不同需求使用不同的类型转换方式,同时有利于代码审查。 下面详细介绍这四种类型转换的使用场景: **static\_cast** 使用方式: ~~~ #include <iostream> ~~~ **使用场景**:基本数据类型之间的转换使用,例如float转int,int转char等,在有类型指针和void\*之间转换使用,子类对象指针转换成父类对象指针也可以使用static\_cast。 非多态类型转换一般都使用static\_cast,而且最好把所有的隐式类型转换都是用static\_cast进行显示替换,不能使用static\_cast在有类型指针之间进行类型转换。 **dynamic\_cast** ### 使用方式: ~~~ #include <iostream> ~~~ **使用场景**:用于将父类的指针或引用转换为子类的指针或引用,此场景下父类必须要有虚函数,因为dynamic\_cast是运行时检查,检查需要运行时信息RTTI,而RTTI存储在虚函数表中,关于虚函数表具体可以看我的这篇文章:[面试系列之C++的*对象*布局](http://mp.weixin.qq.com/s?__biz=MzI3NjA1OTEzMg==&mid=2247484213&idx=1&sn=dc75ae10a8ef2cf6188fe982076e7ea8&chksm=eb7a05a6dc0d8cb0394a43cb0cebe4f454eaf53bb353087d8d3ac7b08c2948edb3fc62172237&scene=21#wechat_redirect) **const\_cast** 使用方式: ~~~ int main() { ~~~ **使用场景**:用于常量指针或引用与非常量指针或引用之间的转换,只有const\_cast才可以对常量进行操作,一般都是用它来去除常量性,去除常量性是危险操作,还是要谨慎操作。 **reinterpret\_cast** 使用方式: ~~~ int main() { ~~~ **使用场景**:没啥场景,类似C语言中的强制类型转换,什么都可以转,万不得已不要使用,一般前三种转换方式不能解决问题了使用这种强制类型转换方式