static_cast类型转换
来源:互联网 发布:淘宝店铺常用推广方式 编辑:程序博客网 时间:2024/04/30 08:43
static_cast一般用来将枚举类型转换成整型,或者整型转换成浮点型。也可以用来将指向父类的指针转换成指向子类的指针。做这些转换前,你必须确定要转换的数据确实是目标类型的数据,因为static_cast不做运行时的类型检查以保证转换的安全性。也因此,static_cast不如dynamic_cast安全。对含有二义性的指针,dynamic_cast会转换失败,而static_cast却直接且粗暴地进行转换。这是非常危险的。
比如:
class B {};class D : public B {};void f(B* pb, D* pd) { D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields // and methods that are not in B. B* pb2 = static_cast<B*>(pd); // Safe conversion, D always // contains all of B.}
上面的第一个类型转换是不安全的。比如,一旦使用pd2调用了一个子类D有而父类B没有的方法,则程序就会因越界访问而崩溃。
static_cast和dynamic_cast都可以用于类层次结构中基类和子类之间指针或引用的转换。所不同的是,static_cast仅仅是依靠类型转换语句中提供的信息(尖括号中的类型)来进行转换;而dynamic_cast则会遍历整个类的继承体系进行类型检查。比如:
class B {public: virtual void Test(){}};class D : public B {};void f(B* pb) { D* pd1 = dynamic_cast<D*>(pb); D* pd2 = static_cast<D*>(pb);}
如果pb确实是指向一个D类型的对象,那pd1和pd2的值是相同的,即使pb为NULL。
如果pb实际指向的是一个B类型的对象,那dynamic_cast就会转换失败,并返回NULL(此时pd1为NULL);而static_cast却依据程序员指定的类型简单地返回一个指针指向假定的D类型的对象(此时pd2不为NULL),这当然是错误的。
static_cast还可以在两个类对象之间进行转换,比如把类型为A的对象a,转换为类型为B的对象。如下:
class A;class B;A a;B b;b = static_cast<B>(a);
此过程可以看做是以a为参数构造一个B类型的临时对象,然后再把这个临时对象赋值给b。如下:
class A;class B;A a;B b;B c(a);b = c;
所以,如果让以上代码通过编译,那么B类必须含有以A类的对象(或对象的引用)为参数的构造函数。如下:
B(A& a){// ...}
这实际上是把转换的工作交给构造函数去做了。
static_cast最常用的是基本类型直接的转换,比如char与int、int与float、enum与int之间的转换。在把int转换为char时,如果char没有足够的比特位来存放int的值(int>127或int<-127时),那么static_cast所做的只是简单的截断,及简单地把int的低8位复制到char的8位中,并直接抛弃高位。在把int转换为enum时,如果int的值没有落进enum的范围内,则enum的值将是“未定义”的。比如,定义一个枚举类型Week,它包含周一到周日七天:
enum Week{Monday = 1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
此时如果把值为8的int转换为week类型,那么这个Week变量不会是周一到周日的任何一天。
Week noday = static_cast<Week>(8);
如果你用“%d”格式把它打印出来,你会发现,它的值确实是8。但这已经超出周一到周日了。世界上没有“星期八”,不是吗?
static_cast甚至可以把任何一个表达式转换为void类型。
再次提醒,static_cast完全靠程序员自己去保证转换的正确性。
static_cast转换的目标类型可以带const、volatile或__unaligned属性。但static_cast不能把源类型的这些熟悉移除。如果想强制移除一个变量的const、volatile或__unaligned属性,请参考const_cast操作符。
小结一下:
static_cast常用来进行基本类型直接的转换,如char与int、int与float、enum与int之间;
static_cast也可以转换用户自定义类型,但目标类型必须含有相应的构造函数;
static_cast还可以转换对象的指针类型,但它不进行运行时类型检查,所以是不安全的;
static_cast甚至可以把任何表达式都转换成void类型;
satic_cast不能移除变量的const属性,请参考const_cast操作符;
static_cast进行的是简单粗暴的转换,所以其正确性完全由程序员自己保证。
- static_cast类型转换
- static_cast转换类型输出
- C++类型转换----static_cast
- 类型转换:static_cast
- 类型转换static_cast,reinterpret_cast,dynamic_cast
- C++static_cast类型转换函数
- static_cast dynamic_cast const_cast reinterpret_cast 类型转换
- C++ - 类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast
- 类型转换static_cast dynamic_cast const_cast reinterpret_cast
- static_cast, const_cast, dynamic_cast, 和reinterpret_cast 类型转换
- C++中的四种显式类型转换之static_cast
- C++中的四种显式类型转换之static_cast
- static_cast、dynamic_cast、reinterpret_cast和const_cast 类型转换
- C++ 显示类型的转换----static_cast
- C++ 中的类型转换 static_cast reinterpret_cast const_cast
- 取消Excel里面全部超级链接
- SQL Server 计算表增长情况
- 2013计算机视觉代码合集一
- 程序员面试题精选100题(61)-数对之差的最大值[算法]
- 等了3个月终于来啦!传智播客C/C++视频教程开始更新喽~
- static_cast类型转换
- 社区发现算法总览
- eclipse下tomcat启动正常,却不能访问8080的原因及解决方案
- Python 内建函数
- logminer使用
- 网络首发]导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程
- __declspec(dllimport) 和 __declspec( dllexport )在DLL 运用中的重要性
- mybatis拦截器的注解说明
- MYSQL /SQL 查询 日期