源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

c++显式类型转换示例详解

  • 时间:2021-08-23 04:52 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:c++显式类型转换示例详解
[b]标准C++包含一个显式的转换语法:[/b] static_cast:用于“良性”和“适度良性”的转换,包括不用强制转换 const_cast:用于“const”和/或“volatile”进行转换 reinterpret_cast:转换为完全不同的意思。为了安全的使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这是所有转换中最危险的。 dynamic_cast:用于类型安全的向下转换 -----常用----- static_cast:用于所有明确定义的转换,包括void*的强制转换、隐式类型转换、类层次的静态定位。 1. 数据类型由小到大的转换,比如int转换为long或float;
[u]复制代码[/u] 代码如下:
int i ; static_cast<long>(i); static_cast<float>(i);
2. 窄化转换,即数据类型由大到小的转换,可能丢失数据; 3. c++中是不允许对一个void*类型的数据赋值的;
[u]复制代码[/u] 代码如下:
void* ptr;  ptr = static_cast<void*>(i);
const_cast:常量转换,如果从const转换为非const或从volatile转换为非volatile,可以使用const_cast。这是const_cast唯一允许的转换。
[u]复制代码[/u] 代码如下:
volatile int k = 0;   int* u = const_cast<int*>(&k);
[b]四种显式的类型转换使用示例[/b] 1、reinterpret_cast 类型转换函数将一个类型的指针,转换为另一个类型的指针。这种转换不需要修改指针变量值数据存放格式,只需在编译时重新编译解释指针的类型就可。
[u]复制代码[/u] 代码如下:
double d=9.3; double *pd=&d; int *pi=reinterpret_cast<int*>(pd);
但是不能用于非指针类型的转换。 同隐式转换一样,reinterpret_cast也不能将一个const指针转换为void*指针。 2、const_cast 用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量。也可以将一个非常量的指针变量转换为一个常指针变量,在编译期间做出类型更改。
[u]复制代码[/u] 代码如下:
const int* pci=0; int* pj=const_cast<int*>(pci);
基于安全性的考虑,const_cast无法将非指针的常变量转换为普通变量。 可以将普通指针变量pi转换为常指针变量,但不能将非指针的普通变量转换为常变量。 3、static_cast 用于基本类型之间和具有继承关系的类型之间的转换,这种转换一般会更改变量的内部表示方式。用于指针类型转换,没有太大意义。
[u]复制代码[/u] 代码如下:
class Base(); class Derived:public Base{} Derived d; Base d=static_cast<Base>(d);
可将继承类对象转换为基类对象。但是反过来不行。 注意:基类指针转换为继承类指针,在一定的危害性。 4、dynamic_cast 与static_cast相对,是动态dynamic_cast转换。这种转换是在运行时进行转换分析的,并非在编译时进行。只能在继承类对象的指针之间或引用之间进行类型转换。进行转换时,会根据当前(RTTI)判断类型对象之间的转换是否合法。dynamic_cast转换失败,是通过是否为null指针检测;引用转换失败,抛出bad_cast异常。 将继承类指针或引用转换为基类指针或引用可以,反过来一般不行;但是如果基类中有虚函数也可以,也就是说被转换的类具有虚函数的对象指针时,编译也通过。
[u]复制代码[/u] 代码如下:
class Base(); class Derived:public Base{} Derived *pd=new Derived; Base *d=dynamic_cast<Base*>(pd);
此外,如果没有继承关系,但是被转换的类具有虚函数的对象指针时,转换也可编译通过。
[u]复制代码[/u] 代码如下:
int i; long m; m=static_cast<long>(i); const int i=0; int* j=(int*)&i; j=const_cast<int*>(&i);//将const型转换成volatile.
[u]复制代码[/u] 代码如下:
#include "iostream" using namespace std; const int sz=100; struct X { int a[sz]; }; void print(X* x) { for(int i=0;i<sz;i++) cout<<x->a[i]<<' '; cout<<endl<<"------------"<<endl; } int main() { X x; print(&x); int* xp=reinterpret_cast<int*>(&x);//cast &x to int* for(int* i=xp;i<xp+sz;i++) *i=0; //cannot use xp as an X* at this point usless you cast it bakc; print(reinterpret_cast<X*>(xp)); print(&x); return 1; }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部