c++中四种_cast类型转换的作用的简述

c++中四种_cast类型转换的作用的简述

优点

使用四种变幻方便在转换出现错误的时候检查错误,比如说,我只查询_cast关键字就能得到左右的类型转化位置。

同时,四种变还也能保证变幻的安全性。

简述

  1. static_cast
    static_cast不能用于不同类型的指针不同类型的引用整形和指针之间的转换,可以用于整形、浮点形、字符之间的相互转换。基本上就是用于静态类型的转换(没有虚函数,不是多态类)
  2. const_cast 主要用于将const常量属性去掉和增加const属性
    使用方法:
type expr = const_cast<type>(expression)
// type只有三种选择: reference(引用), pointer-to-object(指向对象指针), pointer-to-data-member(指向数据的指针)

在四种强制转换中,只有他能脱掉或加上const属性,脱掉const属性时其他的方法会报错(如果你使用(type)这种形式的强制转换为指针或者引用,其实也能将const去掉),但是加上const属性时,这四种方法都可以
例如:

#include<iostream>
using namespace std;

class Base
{
    public:
    virtual void f1(){}
};

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

int main()
{
	//去掉const
    const Base s;
    Base& p = const_cast<Base &>(s);			// 不包错
    Base& p = reinterpret_cast<Base &>(s);		//报错
    Base& p = dynamic_cast<Base &>(s);			//报错
    
    Base& p = (Base &)(s);						//不报错

	// 添加const
	Base bb;
    // const Base &p = (const Base &)bb;            //成功
    // const Base &p = const_cast<const Base &>(bb);//成功
    // const Base &p = dynamic_cast<const Base &>(bb);     //成功
    // const Base &p = reinterpret_cast<const Base &>(bb);     //成功
    // const Base &p = static_cast<const Base &>(bb);     //成功
    return 0;
}
  1. reinterpret_cast
    用于不同类型指针之间不同类型引用之间整数和指针之间的转换,这种转换是逐bit的进行转换,转换的过程其实是可能会引发一些错误,在转换的过程中,程序是不会提示的。
    比如将基类指针转化为派生类指针,实际上就会产生错误、再或者没有多态的基类和派生类在派生类转换为基类的时候,其调用的函数都会是基类的函数,这回产生一些逻辑错误,这种错误实际上可以通dynamic_cast来进行避免。
  2. dynamic_cast
    可以对进行转化的指针、引用进行检查,如果出现错误的话,其返回的指针就会为空!在基类中没有实现多态的话,那么转化的过程中会直接编译不通过。所以dynamic_cast用于实现了多态的类
#include<iostream>
using namespace std;

class Base
{
    public:
    int xx ;
    Base(){
        this->xx = 10;
    }
    virtual void f1(){}

};

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

int main()
{
    Base * pb;
    Child * pc;
    Base b;
    Child c;
    // dynamic_cast<>
    // pb = reinterpret_cast<Base *>(&c);
    pb = dynamic_cast<Base *>(&c);
    if(pb == NULL)cout<<"派生类转化为基类错误"<<endl;
    // pc = reinterpret_cast<Child *>(&b);
    pc = dynamic_cast<Child *>(&b);
    if(pc == NULL)cout<<"基类转化为派生类出现错误"<<endl;       //基类转化派生类是一种不安全的行为
    return 0;
}

参考自:
6. const_cast - 胖子许木木的文章 - 知乎
7. (C++ 成长记录) —— C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast) - 赵萱婷的文章 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值