static_cast < type-id > ( expression )与reinterpret_cast<type-id> (expression)的区别

static_cast< type-id > ( expression )reinterpret_cast<type-id> (expression)的区别


1.    static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。2.1 C语言中隐式类型转换的地方均可使用static_cast<>()进行转换

把空指针转换成目标类型的空指针?。

例如:

double da = 1.1;

    void *pa =&da;

    double *dp =static_cast<double*>(pa);

    double *ddp= reinterpret_cast<double*>(pa);

 

    int ia = static_cast<int>(da);

 

    cout << *dp << endl;

    cout<<*ddp<<endl;

    cout << ia << endl;

输出结果:

把任何类型的表达式转换成void类型

例如char* pa=”abcd”;void * pb=static_cast<void*> pa;

 

2.      reinterpret_cast<type-id>(expression)

 

type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

 

操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换

 

1 Static_cast<>() 静态类型转换,编译时C++ 编译器会做类型检查,基本类型能转换,但是不能转换指针类型。

2)若不同类型之间,进行强制类型转换,用reinterpret<>() 进行重新解释

 

3)一般性结论:C语言中能隐式类型转换的,在C++ 中可用static_cast<>()进行类型转换。因为C++ 编译器在编译检查一般都能通过

        C语言中不能用隐式类型转换的,在C++中可以用reinterpret_cast<>()进行强制类型解释。

例如:

1

    int *n= new int ;

    *n=100;

    double *d=reinterpret_cast<double*>(n);

    double dd=static_cast<double>(*n);

    cout<<*n<<endl;

    cout<<*d<<endl;

    cout<<dd<<endl;

运行结果:

 

例2:

    char* p1="abcd";

    int *p2=reinterpret_cast<int*>(p1);

    int *p5=(int*)p1;

 

    cout<<p1<<endl;

    cout<<p2<<endl;

    cout<<p5<<endl;

 

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值