C++类型转化

 

reinterpret_cast用在任意指针(或引用)类型之间的转化,以及指针与足够大的整数类型之间的转化,从整数类型(包括枚举类型)到指针类型,无视大小。

作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换

#include<iostream>
#include<typeinfo>
using namespace std;

int main()
{
    //Basic type pointer conversion
    double d = 9.3;
    double *pd = &d;
    int *pi = reinterpret_cast<int*> (pd);

    //irrelated class poniter type conversion
    class A{};
    class B{};
    A* pa = new A;
    B* pb = reinterpret_cast<B*>(pa);

    //poniter convertedto integer
    long j = reinterpret_cast<long>(pi);
    
    return 0;
}

 

const_cast 

作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间。

#include<iostream>
#include<typeinfo>
using namespace std;

int main()
{
    const int* pci = 0;        //常量区的值都是0?
    int *pj = const_cast<int*>(pci);

    cout << pj << endl;
    return 0;
}

 

static_cast

作用原理:主要用于基本类型之间和具有继承关系的类型之间的转换。

#include<iostream>
#include<typeinfo>

using namespace std;

int main()
{
    //基本类型转换 
     int i=0;
     double d=static_cast<double>(i);//相当于隐式转换double d=(double) i; 
     int j=static_cast<int>(d);//相当于隐式转换int j=(int)d;
     
     //转换继承类的对象 
     class Base{};
     class Derived:public Base{};
     Derived D;
     Base b=static_cast<Base>(D);//将子类对象赋值给父类对象 
    
    return 0;
}

 

dynamic_cast

作用及其原理:dynamic_cast转换是动态转换,这种转换是在运行时进行转换分析,而不是在编译时期进行,这是区别以上三种转化的一处。

dynamic_cast只能在继承类对象的指针之间或引用之间进行转换,进行转换时,会根据当前运行对象的运行类型信息(RTTI),判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null指针来检测。

#include<iostream>
#include<typeinfo>
using namespace std;

int main()
{
    class Base{};
    class Derived:public Base{};

    Derived* pd = new Derived;    //子类指针转化为父类指针
    Base* pc = dynamic_cast<Base*>(pd);

    if(!pc)
    {
        cout << "Converted error" << endl;
    }
    else
    {
        cout << "Converted success" << endl;
    }

    //没有继承关系,但被转换的类有虚函数
    class A{virtual ~A(){}};    //有虚函数
    class B{};

    A* pa = new A;
    B* pb = dynamic_cast<B*>(pa);

    if (!pb)
    {
        cout << "Converted error. Incldue virtual" << endl;
    }
    else
    {
        cout << "Converted success. Incldue virtual" << endl;
    }
    
    return 0;
    
}

运行结果:

ubuntu@ubuntu:~/wangqinghe/C++/20200120$ g++ dynamic_cast.cpp -o dynamic_cast

ubuntu@ubuntu:~/wangqinghe/C++/20200120$ ./dynamic_cast

Converted success

Converted error. Incldue virtual

 

没有继承关系的类之间转换,如果转换的类中有虚函数,编译器会通过,但是转化失败。

 

总结:

reinterpret_cast    适用于指针转换为另一种指针。允许将任何指针类型转换为其他类型。

const_cast     适用于常指针变量,可以使指针变量变为非常指针变量。

static_cast     主要用于基本类型转换和拥有继承关系变量之间的转换。

dynamic_cast 只能在继承对象的指针之间或引用之间进行类型转换。

 

主要:头文件包含在#include<typeinfo>中。

posted @ 2020-01-19 14:54  王清河  阅读(261)  评论(0编辑  收藏  举报