C++学习 十九、类型转换符

C++学习 十九、类型转换符

前言

本篇学习C++中的四个类型转换符号,static_cast,dynamic_cast,const_cast,reinterpret_cast。

C++使用以上这四种转换代替C风格的强制类型转换。

static_cast

static_cast用于低风险的转换,例如:

  • 自动类型转换,如int转double
  • 向上转换,如派生类指针转基类指针
  • 向下转换,如基类指针转派生类指针(但不安全)
  • 定义了转换构造函数和转换函数的类与类型转换
  • void指针与其它指针转换

使用方法是static_cast<Type> (expression)

    Base* pb;
    Derived* pd;
    pd = static_cast<Derived*>(pb);

而不同内置类型指针转换、整型转指针等高风险转换不能使用static_cast。

static_cast在编译时进行检查,转换失败时报错。

dynamic_cast

dynamic_cast用于继承类之间的转换:

  • 向上转换
  • 向下转换

dynamic_cast由于向上转换是安全的,不会在运行期间检查。而向下转型不安全,因此将在运行期间检查安全性:

    Base* pb;
    Derived* pd;
    pd = dynamic_cast<Derived*>(pb);

对于向上转换,dynamic_caststatic_cast是类似的,对于向下转换,dynamic_cast更安全。

dynamic_cast是运行效率较低的转换。

注意:向下转换要求基类必须有虚函数。

const_cast

const_cast用于去除表达式的const/volatile:

    const int a = 6;
    int* pa = const_cast<int*>(&a);
    *pa = 5;
    std::cout << *pa << std::endl; // 5
    std::cout << a << std:: endl; // 6

&a的类型为const int*,必须使用const_cast<int*>显式转换为int*,不能隐式转换。

reinterpret_cast

reinterpret_cast用于高风险的转换,是static_cast的补充,适用于不同内置类型的指针转换,整型转指针。这些转换在static_cast中是非法的:

    int a = 6;
    double* pa = reinterpret_cast<double*>(&a); // static_cast is invalid
    *pa = 5;
    std::cout << *pa;

reinterpret_cast不能去除表达式的const

由于转换风险大,因此尽量减少使用reinterpret_cast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值