[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语言中的强制类型转换,什么都可以转,万不得已不要使用,一般前三种转换方式不能解决问题了使用这种强制类型转换方式
- C++基础
- 什么是 POD 数据类型?
- 面向对象三大特性五大原则
- 低耦合高内聚
- C++类型转换
- c++仿函数
- C++仿函数了解一下?
- C++对象内存模型
- C++11新特性
- 智能指针
- 动手实现C++的智能指针
- C++ 智能指针 shared_ptr 详解与示例
- 现代 C++:一文读懂智能指针
- Lamda
- c++11多线程
- std::thread
- std::async
- std::promise
- std::future
- C++11 的内存模型
- 初始化列表
- std::bind
- std::tuple
- auto自动类型推导
- 可变参数模板
- 右值引用与移动语义
- 完美转发
- 基于范围的for循环
- C++11之POD类型
- std::enable_if
- C++14/17
- C++20
- 协成
- 模块
- Ranges
- Boost
- boost::circular_buffer
- 使用Boost.Asio编写通信程序
- Boost.Asio C++ 网络编程
- 模板
- 模板特化/偏特化
- C++模板、类模板、函数模板详解都在这里了
- 泛化之美--C++11可变模版参数的妙用
- 模板元编程
- 这是我见过最好的模板元编程文章!