一 概述:
(一)类型转换分类:
(1)隐式类型转换:由编译器自动执行,无需程序员介入。
*编译器会在必要时将类型转换规则应用到内置类型和类类型的对象上。
(2)显式类型转换:强制类型转换。形式:
*旧式强制转换(c语言):type(expr)或(type)expr。
*C++强制类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。使用方法:cast_name<type>(expr)。
(3)何时需要强制类型转换:
*省掉一些不必要的转换,如:double a;int b;将b=b+a改为b=b+static_cast<int>(a)。
*当存在多种转换时,需选择一种特定的类型转换。
*强制类型转换关闭或挂起了正常的类型检查,强烈建议尽量避免使用强制类型转换符。
(二)C++强制类型转换的优点:
*容易识别;
*意义严谨,一个转换操作符只完成一部分类型转换。
二 详细介绍:cast_name<type>(expression)
(一)static_cast:
*编译器执行的任何隐式转换都可由static_cast完成。
*用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
~进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
~进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
*把空指针转化为目标类型指针。
(二)const_cast:去掉表达式的const性质,只能转换指针、引用或a pointer to data member type。
(三)dynamic_cast:将基类类型的指针或引用安全地转换为派生类类型的指针或引用。(条件:派生体系中必须有虚函数,即多态)
*在运行时,只有基类指针实际指向派生类对象时,才转换成功。
*使用例如:
if(Derived *derivedPtr=dynamic_cast<Derived*>(basePtr))
{
//基类指针实际指向派生类对象才转换成功,并且derivedPtr将初始化为basePtr所指的Derived对象。
}
else
{
//否则,转换失败,转换结果为0,derivedPtr置为0.
}
(四)reinterpret_cast:为操作数的位模式提供较低层次的重新解释,依赖于机器,为了安全使用,必须完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节。常用用途:转化函数指针类型。