• 强制类型转换


    显式

    1.C风格(C-style)强制转型如下:(Type) expression          

    2.函数风格(Function-style)强制转型使用这样的语法:Type(expression)

    这两种形式之间没有本质上的不同,仅是括号位置的差别,这两种形式称为旧风格的强制转型,是c++为了“对标准C++之前编写的程序”保持向后兼容性及保持与C语言的兼容性。其有与c++的命名强制类型转换一样的行为,但旧式强制转换的可视性比较差,难以跟踪错误的转换,所以使用c++编程时,一般建议只有在C语言或标准C++之前的编译器上编写代码时,才使用这种语法。(c++ primer4中文版 p160)

    • c优点:简单
    • c缺点:太过随意,没有关键字和标识符,出了问题不容易排查

    C++风格完美的解决了上面两个问题。

    • 1.对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;
    • 2.类型转换有了统一的标示符,利于代码排查和检视。

    下面分别来介绍这四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast.

    一、static_cast转换(替代c风格,隐式转换)

      1.基本用法:static_cast<type-id> expression

      2.使用场景:

      a、用于类层次结构中基类和派生类之间指针或引用的转换

      上行转换(派生类---->基类)是安全的;

      下行转换(基类---->派生类)由于没有动态类型检查,所以是不安全的。

      b、用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证

      c、把空指针转换成目标类型的空指针

      d、把任何类型的表达式转为void类型

      3.使用特点

      a、主要执行非多态的转换操作,用于代替C中通常的转换操作

      b、隐式转换都建议使用static_cast进行标明和替换

    二、dynamic_cast转换

      1.基本用法:dynamic_cast<type-id> expression

      2.使用场景:只有在派生类之间转换时才使用dynamic_casttype-id必须是类指针,类引用或者void*

      3.使用特点:

      a、基类必须要有虚函数,因为dynamic_cast是运行时类型检查,需要运行时类型信息,而这个信息是存储在类的虚函数表中,只有一个类定义了虚函数,才会有虚函数表(如果一个类没有虚函数,那么一般意义上,这个类的设计者也不想它成为一个基类)。

      b、对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存,非法访问等各种问题)

      c、dynamic_cast还可以进行交叉转换

    三、const_cast转换

      1.基本用法:const_cast<type-id>expression

      2.使用场景:

      a、常量指针转换为非常量指针,并且仍然指向原来的对象

      b、常量引用被转换为非常量引用,并且仍然指向原来的对象

      3.使用特点:

      a、cosnt_cast是四种类型转换符中唯一可以对常量进行操作的转换符

      b、去除常量性是一个危险的动作,尽量避免使用。一个特定的场景是:类通过const提供重载时,一般都是非常量函数调用const_cast<const T>将参数转换为常量,然后调用常量函数,然后得到结果再调用const_cast <T>去除常量性。

    四、reinterpret_cast转换

      1.基本用法:reinterpret_cast<type-id>expression

      2.使用场景:不到万不得已,不用使用这个转换符,高危操作

      3.使用特点:  

      a、reinterpret_cast是从底层对数据进行重新解释,依赖具体的平台,可移植性差

      b、reinterpret_cast可以将整型转换为指针,也可以把指针转换为数组

      c、reinterpret_cast可以在指针和引用里进行肆无忌惮的转换

  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11168838.html
Copyright © 2020-2023  润新知