首页 > 编程语言 >c++强制类型转换

c++强制类型转换

时间:2023-01-07 18:12:58浏览次数:58  
标签:类型转换 转换 type c++ cast 强制 expression id 指针

四大强制类型转换

  • 使用强制类型转换意味着放弃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)

标签:类型转换,转换,type,c++,cast,强制,expression,id,指针
From: https://www.cnblogs.com/chenglixue/p/17033133.html

相关文章

  • 计算机管理----强制修改系统密码(win7)
    1、开机,关机,再开机,在出现启动图标时强制关机2、再次开机之后会出现“启动修复”的选项,点击进入修复(不还原,点击取消)3、系统检查完之后,会弹出“启动修复无法自动修复此计......
  • C++实现链式表示多项式加法运算
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructPNo......
  • 纸张尺寸【第十三届蓝桥杯省赛C++C组】
    纸张尺寸在ISO国际标准中定义了\(A0\)纸张的大小为\(1189mm×841mm\),将\(A0\)纸沿长边对折后为\(A1\)纸,大小为\(841mm×594mm\),在对折的过程中长度直接取下整......
  • C++ - TCP/UDP网络编程
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>......
  • LLVM IR与C++ MUL函数代码
    LLVMIR与C++MUL函数代码使用LLVMIR写程序熟悉LLVMIR最好的办法就是使用IR写几个程序。在开始写之前,建议先花30分钟-1个小时再粗略阅读下官方手册(https://llvm.org/do......
  • C/C++学生信息管理系统[2023-01-06]
    C/C++学生信息管理系统[2023-01-06]题目6学生信息管理系统(任选)本系统要求设计一个学生信息管理系统,能够进行学生信息的录入、查找,要求考虑查找效率。本题目要求采用......
  • c++ 指针与引用
    引用很易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候......
  • K8S如何强制删除namespace
    我们有时候会遇到namespace无法删除的情况是因为 finalizers属性的原因1.将cert-mamaner导出为json文件kubectlgetnscert-manager-ojson>cert.json2.编辑cert.js......
  • 数独游戏c++
    问题I:数独游戏时间限制:1.000Sec内存限制:128MB题目描述给你一个N×N的表格(3<N<10),在表格中事先已经填入了一部分的数字,现在请你的表格中空余的格子里填入1~N范围......
  • Dijkstra(迪杰斯特拉)算法C++实现&讲解
    Dijkstra迪杰斯特拉算法及C++实现Dijkstra算法是典型的最短路径路由算法,用来计算一个节点到其他所有节点的最短路径。算法的基本思想和流程是:1.初始化出发点到其它各点的......