C++学习进阶(一):四种cast的用法

在这里插入图片描述
upcast:派生类转换为基类
downcast:基类转换为派生类

dynamic_cast

语法:dynamic_cast<待转换类型>(待转换数据)

  • dynamic_cast在运行时处理
  • dynamic_cast不能用于内置基本数据类型的强制转换,主要是用于类的指针或者类的引用的转换上
  • 允许upcast,也允许downcast。在进行downcast时,dynamic_cast会进行类型检查。只有强制转换的指针指向的对象实际类型与将要转换后的类型相同时才能转换成功,还要求基类对象必须含有虚函数,因为进行类型检查需要运行时类型,这个信息含在虚函数表中。转换不成功,会返回空指针。
class Base{
   public:
       virtual void test(){
       }
};
class Son:public Base{
};
int main(){
    Base* pbb=new Base;
    Base* pbs=new Son;
    Son* pss=new Son;
    Base* p;
    Son* s;
    p=dynamic_cast<Base*>(pss);//派生类转换成基类,允许
    if(p==NULL)cout<<"error1"<<endl;
    s=dynamic_cast<Son*>(pbs);//基类转换为派生类,基类原来指向派生类对象,允许,但是基类必须含有虚函数
    if(s==NULL)cout<<"error2"<<endl;
    s=dynamic_cast<Son*>(pbb);//基类转换为派生类,基类原来指向基类对象,不允许转换
    if(s==NULL)cout<<"error3"<<endl;

    return 0;
}
  • 不允许两个没有关联的类的指针相互转换
class Pass{
};

class Base{
   public:
       virtual void test(){
       }
};
.
.
.
Pass* pa=new Pass;
Base* p=dynamic_cast<Base*>(pa);//两个没有关联的类指针,不允许转换

static_cast

语法:static_cast<待转换类型>(待转换数据)

  • static_cast在编译时处理
  • 可以进行内置数据类型的转换,也可以进行类的指针或者类的引用的强制转换
    int b=static_cast<int>(12.3);//内置数据类型的转换,允许
  • 允许upcast,也允许downcast。static_cast的downcast不进行类型检查,因此是不安全的,程序员必须保证将被强制转换的类的指针指向的实际对象与将要转换的类型相同。
class Base{
   public:
       virtual void test(){
       }
};
class Son:public Base{
};
int main(){
    Base* pbb=new Base;
    Base* pbs=new Son;
    Son* pss=new Son;
    Base* p;
    Son* s;

    p=static_cast<Base*>(pss);//派生类转换成基类,允许
    s=static_cast<Son*>(pbs);//基类转换为派生类,基类指针原指向派生类对象,允许
    s=static_cast<Son*>(pbs);
    //基类转换为派生类,基类指针原指向基类对象,允许但是非常危险

    return 0;
}
  • 不允许两个没有关联的类的指针相互转换
class Pass{
};

class Base{
   public:
       virtual void test(){
       }
};
.
.
.
Pass* pa=new Pass;
Base* p=static_cast<Base*>(pa);//两个没有关联的类指针,不允许转换

const_cast

语法:const_cast<待转换类型>(待转换数据)

  • const_cast在编译时处理
  • const_cast能够将常数据转换为非常数据
    const char* str="12345";
    char* temp=const_cast<char*>(str);//允许

reinpreter_cast

语法:reinpreter_cast<待转换类型>(待转换数据)

  • reinpreter_cast在编译时运行
  • 可以完成任意指针类型向任意指针类型的转换,不进行内容检查和类型检查,只是一个指针到别的指针的二进制拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值