C/C++:四种cast

r e i n t e r p r e t _ c a s t {\red{reinterpret\_cast}} reinterpret_cast

对二进制数据进行重新解释

char *a = new char;
*a = 'a';
cout<<*a<<endl;
printf("%0x\n",a);
int *b = reinterpret_cast<int*>(a);
cout<<*b<<endl;
printf("%0x\n",b);

输 出 : {\orange{输出:}} a 地址 97 地址

两 个 地 址 相 同 , 只 是 对 二 进 制 数 据 进 行 新 的 解 释 {\green{两个地址相同,只是对二进制数据进行新的解释}}

因 为 类 型 长 度 不 一 样 , 很 危 险 {\green{因为类型长度不一样,很危险}}


c o n s t _ c a s t {\red{const\_cast}} const_cast

解除const,必须为指针或引用

struct A{
    int v;
    A():v(0){}
};

int main(){
    // struct 
    const A a;
    A* p1 = const_cast<A*>(&a);  // 指针
    p1->v = 1;
    cout<<a.v<<endl;
    A& p2 = const_cast<A&>(a);  // 引用
    p2.v = 2; 
    cout<<a.v<<endl;
    const int b = 0;
    // int
    int* q1 = const_cast<int*>(&b); // 指针
    *q1 = 1;
    cout<<b<<endl;
    int& q2 = const_cast<int&>(b); // 引用
    q2 = 2;
    cout<<b<<endl;
    return 0;
}

输 出 : 1   2   0   0 {\orange{输出:1\ 2\ 0\ 0}} 1 2 0 0

结 构 体 可 以 , 整 型 不 可 以 {\green{结构体可以,整型不可以}}


d y n a m i c _ c a s t {\red{dynamic\_cast}} dynamic_cast s t a t i c _ c a s t {\red{static\_cast}} static_cast

dynamic_cast:向下安全转型,继承链必须有虚函数,RTTI通过虚表实现
static_cast:数据类型转型,最常见的类型转换,有可能不安全。

主要用于继承体系,由 指 向 派 生 类 的 基 类 指 针 {\red{指向派生类的基类指针}} 转为 派 生 类 指 针 {\red{派生类指针}} 兄 弟 类 指 针 {\red{兄弟类指针}}

class A1{
    public:
    virtual void printA1(int x=1){cout<<"A1 "<<x<<endl;}
};

class A2{
    public:
    virtual void printA2(int x=2){cout<<"A2 "<<x<<endl;}
};

class B:public A1,public A2{
    public:
    virtual void printA1(int x=10){cout<<"B:A1 "<<x<<endl;}
    virtual void printA2(int x=20){cout<<"B:A2 "<<x<<endl;}
};

int main(){
    A1 *a1 = new B;
    //p->printA2(); //error
    B *b = dynamic_cast<B*>(a1); // 派生类
    b->printA2();
    A2 *a2 = dynamic_cast<A2*>(a1); // 兄弟类
    a2->printA2();
    B *bs = static_cast<B*>(a1);
    // A2 *a2d = static_cast<A2*>(a1); //error
    return 0;
}

输 出 : {\orange{输出:}} : B:A2 20 B:A2 2

d y n a m i c _ c a s t 可 以 将 基 类 指 针 转 为 派 生 类 , 转 为 基 类 的 兄 弟 类 。 {\green{dynamic\_cast可以将基类指针转为派生类,转为基类的兄弟类。}} dynamic_cast

s t a t i c _ c a s t 可 以 将 基 类 指 针 转 为 派 生 类 {\green{static\_cast可以将基类指针转为派生类}} static_cast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值