C和C++的强制类型转换

本文详细介绍了C++中的四种强制类型转换:static_cast、const_cast、dynamic_cast和reinterpret_cast,包括它们的使用场景、注意事项和潜在风险。强调了动态类型检查的重要性以及在不同转换中如何选择合适的转换方式。
摘要由CSDN通过智能技术生成

C++ 四种强制类型转换

一般来说,我们需要类型转换的场景可以分为如下几种:

  • 整型和浮点型以及不同长度的数据相互转换

    一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题

  • 整型和指针相互转换

    当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。

  • 整型和枚举类型相互转换。

    这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。

  • 指针和无类型指针相互转换

1. C风格的强制转换

​ C风格的强制转换很简单,有显示转换隐式转换,显示转换不管什么类型之间都是用以下方式:

​ Type a = (Type) b; //将b的类型强制转换为a的类型

但是C风格的强制转换可能带来一些隐患,让一些问题难以察觉.所以C++提供了一组可以用在不同场合的强制转换的函数。

2. C++ 四种强制转换类型函数
  1. static_cast

    用法为 static_cast < Type > (expression),该运算符把 expression 转换为 Type 类型,但没有运行时类型检查来保证转换的安全性

应用的场合和要注意的问题:

  1. static_cast 作用和C语言风格强制转换的效果基本一样,由于没有运行时类型检查来保证转换的安全性,所以这类型的强制转换和C语言风格的强制转换都有安全隐患。
  2. 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。注意:进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  3. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性需要开发者来维护。
  4. 把空指针转换成目标类型的空指针。
  5. 把任何类型的表达式转换成void类型。
  6. static_cast不能转换掉原有类型的const、volatile属性。
  7. 在c++ primer 中说道:c++ 的任何的隐式转换都是使用 static_cast 来实现
/* 常规的使用方法 */
float a = 3.14f
int   b = static_cast<int>(a); // b 的值为 3

/* 类中的上下行转换 */
class Base{
   
    
};
class Drived : public Base{
   
    
};

//  上行 Drived -> Base
//编译通过,安全
Drived d;
Base *base_ptr = static_cast<Base*>(&d);  

//  下行 Base -> Drived
//编译通过,不安全
Base base;
Sub *sub_ptr = static_cast<Sub
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值