一、强制类型转换
1、const_cast
用于去掉底层 const,将实参(常引用 / 指向常量的指针)转换为 普通引用和普通指针。反之是隐式转换。
const char *p;
char *ps = const_cast<char*>(p);
2、static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
任何 不涉及 去掉底层const 的转换(显示 / 隐式)。多用于一般的显式转换,替代旧风格的显示转换(与通常的隐式转换相反的场所)。
//指针取回
char *p;
void *ps = p; //隐式转换
p = static_cast<char*>(ps); //显示转换,转回 char,转成其他类型将引发错误
//关闭精度损失的警告
int a;
char c = static_cast<char>(a);
3、reinforce_cast
很危险,尽量避免使用。为 运算对象的位模式 提供 较低层次上的重新解释。底层二进制数值的拷贝,不做任何类型检查和转换。
//错误的转换,但是不会报错
int *pa;
char *pc = reinterpret_cast<char *>(pa);
4、dynamic_cast
将 基类指针或者引用 转换为 派生类指针或者引用,在运行时识别类型,使用所绑定对象的动态类型。反之是隐式转换。
不存在 基类对象 到 派生类对象 的转换,只能转指针或引用。
向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。
Base *pb;
Derived *pd = dynamic_cast<Derived *> pb;
二、隐式类型转换
1、算术相关类型转换
(1)、整形提升:小整形 提升为 大整形
(2)、布尔转换:非布尔 转换为 布尔
(3)、算术转换:小类型 统一为 大类型
(4)、无符转换:有符号 转换为 无符号。(在类型一样大小的时候,否则按 (3) 处理)
2、指针转换
(1)、数组 转换为 指针
(2)、非常量类型指针 转换为 无类型指针:Type * ---> void *
(3)、任何类型指针 转换为 指向常量的无类型指针:const Type * ---> const void*、Type * ---> const void*
3、指向变量的指针/引用 ---> 指向常量的指针/引用
(1)、Type * ---> const Type *
(2)、Type & ---> const Type &
精讲链接:
https://blog.youkuaiyun.com/u014450222/article/details/81428336