C/C++:四种cast

reinterpret_cast{\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{因为类型长度不一样,很危险}}


const_cast{\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{结构体可以,整型不可以}}


dynamic_cast{\red{dynamic\_cast}}dynamic_caststatic_cast{\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

dynamic_cast可以将基类指针转为派生类,转为基类的兄弟类。{\green{dynamic\_cast可以将基类指针转为派生类,转为基类的兄弟类。}}dynamic_cast

static_cast可以将基类指针转为派生类{\green{static\_cast可以将基类指针转为派生类}}static_cast

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值