强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。

static_cast<type-id>      (expression)
dynamic_cast<type-id>     (expression)
const_cast<type-id>       (expression)
reinterpret_cast<type-id> (expression)
//type-id为目标数据类型,expression为原始数据类型变量或者表达式。

    static_cast

    • 编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。
    double a = 1.999;
    int b = static_cast<double>(a); //编译器编译后int b = static_cast<int>(static_cast<double>(a));

    把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。

    • 使用static_cast可以找回存放在void*指针中的值。
    double a = 1.999;
    void * vptr = & a;
    double * dptr = static_cast<double*>(vptr);
    cout<<*dptr<<endl;//输出1.999

    static_cast仅仅是依靠类型转换语句中提供的信息来进行转换,而dynamic_cast则会遍历整个类继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些。

    • static_cast可以把任何类型的表达式转换成void类型。
    • 另外,与const_cast相比,static_cast不能把换掉变量的const属性,也包括volitale或者__unaligned属性。

    dynamic_cast

    是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。

    dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。当编译器不开启RTTI时,运行含有dynamic_cast操作符的程序时会出现一个警告:

    • dynamic_cast主要用于“安全地向下转型”,dynamic_cast用于类继承层次间的指针或引用转换。

    const_cast
    将转换掉表达式的const性质。

    int main()
    {
        const int constant = 26;
        const int* const_p = &constant;
        int* modifier = const_cast<int*>(const_p);
        *modifier = 3;
        cout<< "constant:  "<<constant<<endl;  //输出26
        cout<< "const_p:  "<<*const_p<<endl;   //输出26
        cout<<"*modifier:  "<<*modifier<<endl; //输出3
        return 1;
    }
    
    

    reinterpert_cast

    type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

     reinterpret意为“重新解释”

    02-22 00:56