四大强制类型转换
- 使用强制类型转换意味着放弃c++的安全保障
static_cast
-
语法
static_cast <type-id> ( expression )
-
作用
将表达式转换为 type-id 类型
-
注意
- 没有
运行期类型检查
来保证转换的安全性 - static_cast 操作符可用于如将指向基类的指针转换为指向派生类的指针等操作。这种转换并不总是安全的
- 上⾏转换:把
派⽣类
的指针或引⽤转换成基类
是安全
的 - 下⾏转换:把
基类
的指针或引⽤转换为派⽣类
表示,由于没有动态类型检查,所以不安全
- 上⾏转换:把
- 一般而言,如果要将
枚举等
数值数据类型转换为整数
,或者将整数
转换为浮点数
,并且确定转换中涉及的数据类型,可以使用 static_cast - 把空指针转换成目标类型的空指针
- ⽤于基本数据类型之间的转换,转换的安全由开发人员来保证
- 把任何类型的表达式转换成void类型
- 无法转换 const、volatile
- 使用应该仅限于性能关键型代码;若要发布,则用safe _ cast(safe_cast (C++/CLI and C++/CX) | Microsoft Learn) 替换它
- 没有
dynamic_cast
-
语法
dynamic_cast < type-id > ( expression )
-
作用
将expression转换为类型为 type-id 的对象
-
注意
- type-id 必须是指向先前定义的class类型或“指向 void 的指针”的指针或引用
- 如果 type-id 是指针,则expression的类型必须是指针; 如果 type-id 是引用,则expression的类型必须是引用
- 尽管 Dynamic _ cast 转换更安全,但 Dynamic _ cast
只能在指针或引用
上工作,并且运行时类型检查是开销 - dynamic本身只能⽤于存在
虚函数的⽗⼦关系
的强制类型转换- 对于指针,转换失败则返回
nullptr
。但当 type-id 是指向值类型的内部指针时,Dynamic _ cast 将不再引发异常,转换将在运行时失败 - 对于引⽤,转换失败会抛出
异常
- 对于指针,转换失败则返回
reinterpret_cast
-
语法
reinterpret_cast < type-id > ( expression )
-
作用
允许将任何指针转换为任何其他指针类型。还允许将任何整数类型转换为任何指针类型
-
注意
-
错误地使用reinterpret_cast风险较高。除非所需的转换本身是
低级的
,否则应该使用其他强制转换运算符之一 -
reinterpret_cast的结果除了被强制转换回其
原始类型
之外,不能安全地用于其他任何用途。其他用途平台移植性差 -
reinterpret_cast不能去掉const、volatile
-
转换过程仅仅只是比特位的拷贝
-
一个实际用途是在
hash函数
中,它将值映射到索引,这样两个不同的值很少会以相同的索引结束#include <iostream> using namespace std; // Returns a hash code based on an address unsigned short Hash( void *p ) { unsigned int val = reinterpret_cast<unsigned int>( p ); return ( unsigned short )( val ^ (val >> 16)); } using namespace std; int main() { int a[20]; for ( int i = 0; i < 20; i++ ) cout << Hash( a + i ) << endl; } Output: 64641 64645 64889 64893 64881 64885 64873 64877 64865 64869 64857 64861 64849 64853 64841 64845 64833 64837 64825 64829
-
const_cast
-
语法
const_cast <type-id> (expression)
-
作用
移除expression的 const、 volatile属性
-
注意
- 根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针进行写操作可能会产生未定义行为
- 不能使用 const _ cast 运算符直接覆盖const变量的常量状态
reference
Casting Operators | Microsoft Learn
知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 (zsxq.com)
标签:类型转换,转换,type,c++,cast,强制,expression,id,指针 From: https://www.cnblogs.com/chenglixue/p/17033133.html