c++类型转换

静态转换

格式:

static_cast<目标类型>(原始对象)
  • 可以进行基础数据类型转换
  • 父与子类型转换
  • 没有父子关系的自定义类型不可以转换

例:

class Base{};

class Child:public Base{};

class Other{};

void test()

{

Base *base=NULL;

Child* child=NULL;
//把base转为Child*类型 向下转型  不安全

Child*Child2=static_cast(base);
//把child 转为Base* 向上转型  安全
Base*base2=static_cast(child);
//无效转换
//Other* other=static_cast(base);
}

动态转换

格式:

dynamic_cast<目标类型>(原类型);
  • 基础类型不可以转换
  • 非常严格,失去精度或者不安全都不可以转换

父子之间可以转换

  • 父转子不安全
  • 子转父安全
  • 如果发生了多态,都可以转换
class Base{
virtual void func() {};
};

class Child:public Base{
virtual void func() {};
};

class Other{};
void test()
{
    Base* base = NULL;

    Child* child = NULL;
    //把base转为Child*类型 向下转型  不安全

    //Child* Child2 = dynamic_cast(base);
    //把child 转为Base* 向上转型  安全
    Base* base2 = dynamic_cast(child);
    Base* base3 = new Child;
    Child* Child3 = dynamic_cast(base3);

    
};

常量转换

常量转换(const_cast)

  • 该运算符用来修改类型得const属性

  • 常量指针被转化成非常量指针,并且仍然指向原来得对象

  • 常量引用被转换成非常量引用,并且仍然指向原来得对象

    例:

    //取出const

    const int * p=NULL;
    
    int *newp=const_cast(p)
    

    //加上const

     int * p=NULL;
    
    const int *newp=const_cast(p)
    

    //不能对非指针或非引用的变量进行转换

    //const int a=10;
    
    //int b=const(a);错误
    

    常量引用转换成非常量引用

    int num=10;
    
    int &refNum=num;
    
    const int &refNum2=const_cast(refNum);
    

注意:不能直接对非指针和非引用得变量使用const_cast操作符去直接移除它的const

重新解释转换(reinterpret_cast)

不推荐使用,最不安全,最鸡肋

int a=10;

int *p=reinterpret_cast(a);

你可能感兴趣的:(c++类型转换)