c++强制类型转换

四大强制类型转换

  • 使用强制类型转换意味着放弃c++的安全保障

static_cast

  • 语法

    static_cast <type-id> ( expression )
    
  • 作用

    将表达式转换为 type-id 类型

  • 注意

    1. 没有运行期类型检查来保证转换的安全性
    2. static_cast 操作符可用于如将指向基类的指针转换为指向派生类的指针等操作。这种转换并不总是安全的
      1. 上⾏转换:把派⽣类的指针或引⽤转换成基类安全
      2. 下⾏转换:把基类的指针或引⽤转换为派⽣类表示,由于没有动态类型检查,所以不安全
    3. 一般而言,如果要将枚举等数值数据类型转换为整数,或者将整数转换为浮点数,并且确定转换中涉及的数据类型,可以使用 static_cast
    4. 把空指针转换成目标类型的空指针
    5. ⽤于基本数据类型之间的转换,转换的安全由开发人员来保证
    6. 把任何类型的表达式转换成void类型
    7. 无法转换 const、volatile
    8. 使用应该仅限于性能关键型代码;若要发布,则用safe _ cast(safe_cast (C++/CLI and C++/CX) | Microsoft Learn) 替换它

dynamic_cast

  • 语法

    dynamic_cast < type-id > ( expression )
    
  • 作用

    将expression转换为类型为 type-id 的对象

  • 注意

    1. type-id 必须是指向先前定义的class类型或“指向 void 的指针”的指针或引用
    2. 如果 type-id 是指针,则expression的类型必须是指针; 如果 type-id 是引用,则expression的类型必须是引用
    3. 尽管 Dynamic _ cast 转换更安全,但 Dynamic _ cast 只能在指针或引用上工作,并且运行时类型检查是开销
    4. dynamic本身只能⽤于存在虚函数的⽗⼦关系的强制类型转换
      1. 对于指针,转换失败则返回 nullptr。但当 type-id 是指向值类型的内部指针时,Dynamic _ cast 将不再引发异常,转换将在运行时失败
      2. 对于引⽤,转换失败会抛出异常

reinterpret_cast

  • 语法

    reinterpret_cast < type-id > ( expression )
    
  • 作用

    允许将任何指针转换为任何其他指针类型。还允许将任何整数类型转换为任何指针类型

  • 注意

    1. 错误地使用reinterpret_cast风险较高。除非所需的转换本身是低级的,否则应该使用其他强制转换运算符之一

    2. reinterpret_cast的结果除了被强制转换回其原始类型之外,不能安全地用于其他任何用途。其他用途平台移植性差

    3. reinterpret_cast不能去掉const、volatile

    4. 转换过程仅仅只是比特位的拷贝

    5. 一个实际用途是在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属性

  • 注意

    1. 根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针进行写操作可能会产生未定义行为
    2. 不能使用 const _ cast 运算符直接覆盖const变量的常量状态

reference

Casting Operators | Microsoft Learn

知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 (zsxq.com)

原文链接: https://www.cnblogs.com/chenglixue/p/17033133.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++强制类型转换

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/310206

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午11:26
下一篇 2023年2月16日 上午11:26

相关推荐