隐式类型转换就是编译器自动转;
显式类型转换类如
(char)
强制类型转换运算符
C 存在隐式转换和显式转换。C++ 的隐式转换和 C 相同,而把 C 的非常笼统且不安全的显式转换细分为了四种显式转换,如下。
reinterpret_cast
字面意思是按位“重新解释”,可以实现 指针
和另一种指针/整数
的互相转换。
1 | int * int_ptr = new int; |
const_cast
能(且只能)为变量加上或删除 const
、volatile
和 __unaligned
特性。
但需要注意的是,const_cast
修改使用 const
创建的变量是未定义行为。原因是,如果在创建变量时使用 const int
,编译器可以进行优化,修改这种变量是未定义行为(详见 cv 限定符 部分)。
1 | void square(const int* px) { |
如果定义为 const volatile
阻止编译器优化,修改这种变量是合法的。
1 | void square(const volatile int* px) { |
static_cast
static_cast<int>
类似于 C 的显式转换,可用于父类向派生类转换、int
向 char
转换等。这些报错都是在编译阶段完成。
1 | float f = 2.33; |
1 | struct A {}; |
但是不同的是,显式转换是真的什么都可以转,而 static_cast
还是做了一些限制的,比如不能做 const_cast
reinterpret_cast
以及不相关的类型转换。
1 | struct A {}; |
dynamic_cast
- 用于多态类型的转换
- 执行行运行时类型检查
- 只适用于指针或引用
- 对不明确的指针的转换将失败(返回
nullptr
),但不引发异常 - 对不明确的引用的转换将抛出
bad_cast
异常
- 可以在整个类层次结构中移动指针,包括向上转换、向下转换
bad_cast 异常
- 由于强制转换为引用类型失败,dynamic_cast 运算符引发 bad_cast 异常。