标签: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