C++中四种强制转换符

C++中四种强制转换符分别为:const_cast, static_cast, dynamic_cast, reinterpret_cast;在C++中这是一个很常见的话题,特别是对于新人。然后就……
一般来说,在类型转换中会出现以下几种情况:
- int 转换 float:常出现在数学计算中,比如:提高计算的精度等;
- int 转换 enum:枚举常用于表意,而实际参与计算的仍是int类型;
- int 和 指针互转:试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。
- 有类型指针和无类型指针:
- 转换不同长度的数据:截取数据的问题;
- 存在继承关系的类指针转换:多用于多态场景中;
- 无继承关系的类指针转换:不是特别常用

在测试上面的其中情况时,我们会出现一下问题:
1、编译器出错。这是因为语法规定这种使用不合法。所以编译器在编译代码时,认为该行为违法,终止之后的流程。
2、运行时出错。这是因为在语法上是合法的,但是运行时是不合理的。

下面,我们主要讲述const_cast, static_cast, dynamic_cast, reinterpret_cast四种强制转换符的区别:

1. static_cast

是最常用的类型的转换符,如下所示:

int i;
float f = 3.28;
i = static_cast<int>(f);
2. const_cast

看见const不要认为是将其长量化,而是恰恰相反;其作用是取出变量的const属性,把const类型的指针变为非const类型的指针;如下所示:

const int *fun(int a, int b){}
int const_cast<int *> (fun(1, 2));
3. dynamic_cast

主要用于运行时检查该类型转换是否符合类型安全,但只在多态类型中使用时合法的,即该类中至少有一个virtual。

4. reinterpret_cast

其中reinterpret的中文意思是“重新解释”;而在热interpret_cast中表示数据的二进制形式重新解释,但是该二进制的值是不会被改变的。如下所示:

int i;
char *ptr = "I Love You!!!";
int i = reinterpret_cast<int>(ptr);

下面用代码代替前面的几种情况:

//指针转换整型
int a = dynamic_cast<int>(int *p);
//整型转换指针
int *p = dynamic_cast<int *>(int a);

//整型转换浮点型
float a = dynamic_cast<float>(int a);
//浮点型转换整型
int a = dynamic_cast<int>(float);

//类型指针转换无类型指针
void *p = dynamic_cast<void *>(int *p1);
//无类型指针转换类型指针
int *p = dynamic_cast<int *>(void *p);

//整型转换枚举
TYPE t = dynamic_cast<TYPE>(int a);
//枚举转换整型
int a = dynamic_cast<int>(TYPE t);

//无类型指针转换整型
int a = dynamic_cast<int>(void *p);
//无类型指针转换其他指针
Other *p = dynamic_cast<Other *>(void *pv);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值