static_cast运算符
表达式 static_cast < type-id > ( expression ) 把expression转换为基于expression类型的另外一个类型type-id。转换时不进行运行时类型检查来确保安全性。
语法
static_cast < type-id > ( expression )
static_cast运算符可以进行类似这样的操作:把一个基类指针转换为派生类指针。这样的转换并不总是安全的,比如:
- class B { ... };
- class D : public B { ... };
- void f(B* pb, D* pd)
- {
- D* pd2 = static_cast<D*>(pb); // 不安全, pb可能只是指向B
- B* pb2 = static_cast<B*>(pd); // 安全转换
- ...
- }
和dynamic_cast不同的是,在对pb进行static_cast转换时不进行运行时类型检查。pb指向的对象可能不是类D的一个对象,这种情况下,使用*pd2很可能造成灾难。比如,调用了一个类D的成员函数,而这个函数不是类B的成员函数,将导致访问冲突。
dynamic_cast和static_cast运算符沿着类的层次结构来移动一个指针。然而,static_cast只依赖cast声明中提供的信息,因此不安全。比如:
- class B { ... };
- 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 == 0,他们的值也将相同。
如果pb指向了类B的一个对象,它不是一个完整的D类,那么dynamic_cast会懂得返回一个0值。然而,static_cast依赖于程序员的断言,即pb指向了类D的一个对象,并且简单地返回一个指向假定的D对象的指针。
因此,static_cast可以做反向的强制转换,这种情况下结果是不明确的。确保static_cast转换结果的安全这个任务就留给了程序员来做。
这种行为同样适用于除了类类型转换外的其他类型转换。比如,static_cast可以用来把一个int转换为char。然而做为转换结果的char可能没有足够的二进制位来保存int的值。同样的,确保static_cast转换结果的安全这个任务就留给了程序员来做。
static_cast运算符同样能用于实现任何强制转换,包括标准的转换和用户自定义的转换。比如:
- typedef unsigned char BYTE
-
- void f()
- {
- char ch;
- int i = 65;
- float f = 2.5;
- double dbl;
- ch = static_cast<char>(i); // int to char
- dbl = static_cast<double>(f); // float to double
- ...
- i = static_cast<BYTE>(ch);
- ...
- }
static_cast运算符能够明确地把一个整形值转换为枚举类型。如果整形值不在枚举值的范围之内,转换得到的枚举值也是不确定的。
static_cast运算符可以把一个空指针转换为目标类型的空指针。
static_cast运算符可以明确地把一个表达式转换为void类型。这个void类型可以包括const,volatile或者__unaligned属性。
static_cast运算符不能够抛弃const,volatile,或者__unaligned属性,可以查看const_cast运算符的说明中关于移除这些属性的信息。
c++,
类型转换,
dynamic cast,
static cast
分享到:
相关推荐
[MSDN].msdn_oct_2001 适用于vc++6.0,最后一个版本。分成7个文件上传
[MSDN].msdn_oct_2001 共三个文件
[MSDN].msdn_oct_2001.part02 [MSDN].msdn_oct_2001 适用于vc++6.0,最后一个版本。分成7个文件上传
[MSDN].msdn_oct_2001.part17.rar
[MSDN].msdn_oct_2001.iso(3-2) 我自己用的!
《MSDN_C_C++函数速查手册》是针对C和C++编程语言的重要参考资料,它提供了详尽的函数文档和快速查询功能。MSDN(Microsoft Developer Network)是微软为开发者提供的一个综合平台,包含了丰富的技术文档、代码示例...
2001年的MSDN帮助文件,如"vchelp.rar_msdn 2001 chm_msdn20_msdn2001_msdn2001 chm_vche"所示,是当时为VC++6.0用户提供的官方文档,包含了丰富的编程指南和技术资料。 首先,我们要了解CHM(Compiled Help Manual...
[MSDN] msdn oct 2001 适用于vc++6.0,最后一个版本。分成7个文件上传
vc++6.0 MSDN Library chm
MSDN_OCT_2001 part01MSDN_OCT_2001 part01 msdn part 1 一共1G多
MSDN,微软帮助文件,不用安装,只有100多M, 共19个压缩包,都下载后解压缩
MSDN,全称为Microsoft Developer Network,是微软公司提供的一套全面的开发资源库,它包含了Windows操作系统、.NET Framework、Office、SQL Server等微软产品和技术的详细文档、API参考、示例代码以及开发工具等...
MSDN_Oct_2001.part05
MSDN_new_CN.chmMSDN_new_CN.chmMSDN_new_CN.chm
本压缩包文件“Qt.rar”包含的“Qt参考文档.chm”是学习Qt开发的重要资源,类似于微软的MSDN,为开发者提供了详尽的API参考和教程。 Qt库提供了丰富的类和函数,涵盖了图形用户界面(GUI)、网络通信、数据库集成、...
**WM_USER 宏详解** WM_USER 宏是 Windows 操作系统中用于定义应用程序私有消息的一个关键工具,尤其在Windows CE环境下。它允许开发者在创建自定义窗口类时定义自己的消息,以实现特定的功能和交互。...
MSDN_OCT_2001big.part02.rar
VS2010 MSDN C++ SDK_00VS2010 MSDN C++ SDK_00
简化版MSDN-MSDN_1.2.2.part2.rar