码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-31 10:35:16      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:c++

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;

 

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:c++

原文地址:http://blog.csdn.net/toconnection/article/details/47166093

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!