类型转换
旧式转型有两种常见的形式:
1 | T(expression) |
四种新式转型:cast-name<type>(expression),type是转换的目标类型,expression是要转换的值。若type是引用类型,则结果是左值。cast-name是static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。
旧式转换表面上功能强大,但是转化时不够明确,不能进行错误检查,容易出错。
const_cast通常被用来将对象的常量性移除.即将const对象转为非const对象。
dynamic_cast
- 主要用来执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个类型.
- 用于动态类型转换,只能用于含有虚函数的类,用于类层次间的向上和向下转化.只能转指针或引用.向下转化时,如果是非法的,对于指针返回nullptr,对于引用抛出异常.
- 向上转换:子类向基类的转换
- 向下转换:基类向子类的转换
- 它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换.
- 它是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作.
reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编译器,这也就表示它不可移植.例如将一个pointer to int转型为一个int. 这一类型在低级代码以外很少见。
static_cast用来强迫隐式转换
- 将non-const对象转为const对象
(不能隐式地将一个左值转换为一个右值引用,但是可以使用static_cast可以显式地将一个左值转换为一个右值引用
- 或将int转为double
用于多态向上转换,如果向下转型能成功但是不安全,结果未知
- 也可以用来执行上述多种转换的反向转换
将void*指针转换为typed指针
- 将point-to-base转为pointer-to-derived。
但它无法将const转为non-const,这个只有const_cast才办得到。
参考文献
[1]更深入理解reinterpret_cast:https://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.html