C++ 类型强转

news/2024/10/5 21:07:40
  1. static_cast
    • 基本概念
      • static_cast主要用于在相关类型之间进行转换,这些类型之间存在某种隐式转换关系。它在编译时进行检查,是一种比较安全的类型转换方式。
    • 适用场景
      • 基本数据类型转换:例如将int转换为double,或者double转换为int(会截断小数部分)。
        int numInt = 5;
        double numDouble = static_cast<double>(numInt);
        int newNumInt = static_cast<int>(3.14);
        
      • 类层次结构中的向上转换(将派生类指针或引用转换为基类指针或引用):假设存在基类Base和派生类Derived
        class Base {};
        class Derived : public Base {};Derived d;
        Base* b = static_cast<Base*>(&d);
        
  2. dynamic_cast
    • 基本概念
      • dynamic_cast主要用于在类的层次结构中进行安全的向下转换(将基类指针或引用转换为派生类指针或引用),它在运行时进行类型检查。
    • 适用场景
      • 当有一个基类指针指向一个派生类对象,想要将其转换回派生类指针时使用。如果转换成功,返回有效的派生类指针;如果转换失败(例如基类指针实际指向的不是目标派生类对象),则返回nullptr(对于指针类型)或者抛出std::bad_cast异常(对于引用类型)。
        class Base { virtual void f() {} };
        class Derived : public Base {};Base* b = new Derived();
        Derived* d = dynamic_cast<Derived*>(b);
        if (d!= nullptr) {// 转换成功,可以安全使用d
        } else {// 转换失败
        }
        
  3. const_cast
    • 基本概念
      • const_cast用于去除或添加constvolatile限定符。它主要用于在一些特定情况下修改原本被定义为const的对象,但这种操作应该谨慎使用,因为修改const对象可能会违反程序的逻辑和语义。
    • 适用场景
      • 当有一个const对象,但需要调用一个非const成员函数(该函数不会实际修改对象状态且这种操作是合理的情况下)。例如:
        class MyClass {
        public:void nonConstFunction() {}
        };const MyClass myObj;
        // 以下代码通过const_cast将const对象转换为非const对象,以便调用nonConstFunction
        const_cast<MyClass&>(myObj).nonConstFunction();
        
  4. reinterpret_cast
    • 基本概念
      • reinterpret_cast是一种比较危险的类型转换,它可以将一种类型的指针转换为另一种几乎完全不相关类型的指针,或者将一个整数转换为指针类型,反之亦然。这种转换不进行任何类型检查,几乎是对内存的重新解释。
    • 适用场景
      • 在一些与底层硬件交互或者特定的内存操作场景下可能会用到,但要非常小心。例如,将一个整数表示的内存地址转换为某种类型的指针(这种操作在某些特定的嵌入式系统或者内存管理代码中可能会出现)。
        int num = 0x12345678;
        // 将整数转换为字符指针(这是一种危险操作,仅用于示例)
        char* ptr = reinterpret_cast<char*>(&num);
        
  5. C - style类型转换(旧的、不推荐的方式)
    • 基本概念
      • 在C++中仍然可以使用C - style类型转换,它的形式为(目标类型)表达式。这种转换方式不区分转换的类型,可能会隐藏一些潜在的错误。
    • 缺点
      • 例如,(int)3.14这种转换,看起来很简单,但它没有像C++新的类型转换那样明确的语义区分,在复杂的代码中可能会导致难以发现的错误。而且它不像dynamic_cast那样在运行时进行类型检查,也不像static_cast那样在编译时进行严格的类型关系检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/68131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

订单交易平台一

简介:订单交易平台核心的功能模块:认证模块,用户名密码 或 手机短信登录(60s有效)。角色管理,不同角色具有不同权限 和 展示不同菜单。 管理员,充值客户,下单客户管理,除了基本的增删改查以外,支持对客户可以分级,不同级别后续下单折扣不同。交易中心管理员可以给客…

学习“基于VirtualBox虚拟机安装Ubuntu图文教程”

安装过程中出现了很多问题第一次安装没有下载ubtun20.04 镜像 第二次安装不知道如何下载bzip2,导致一直安装增强功能 第三次在上B站搜索视频讲解后成功安装好了

wintools premium 24.10.1 注册分析

wintools premium 24.10.1 目录wintools premium 24.10.1NAGSCREEN_proc_472350check_472BF0pyps win32 程序,程序注册逻辑简单,关注窗口事件、控件id可快速定位到关键逻辑。 NAGSCREEN_proc_472350 INT_PTR __thiscall NAGSCREEN_proc_472350(void *this, HWND hDlg, UINT a…

项目部署二:服务器和环境配置

2.服务和环境配置 下面的配置和操作均在腾讯云服务器+CentOS 7.5的系统下进行。 2.1 MySQL安装服务端 yum install mariadb-server -y mariadb-server.x86_64 1:5.5.68-1.el7安装客户端 yum install mariadb -y 软件包 1:mariadb-5.5.68-1.el7.x86_64 已安装并且是最新版本服务…

freeRTOS源码解析4--tasks.c 7

4.2.20 空闲任务调用1--prvCheckTasksWaitingTermination 删除所有终止的任务, 释放资源。简单描述就是清空xTasksWaitingTermination列表,释放资源,递减uxCurrentNumberOfTasks和uxDeletedTasksWaitingCleanUp。接口:static void prvCheckTasksWaitingTermination( void )接…

软件工程师课程辅导

Day1 环境搭建下载vscode下载链接:https://pan.baidu.com/s/1Oo1TIrAKmlEuEfdn9EXgLQ?pwd=nkt9配置vscode的python开发环境教程:https://www.runoob.com/python3/python-vscode-setup.html安装Pycharm下载教程:https://blog.csdn.net/qq_44809707/article/details/12250111…

PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法

在当今海量数据时代,有效的信息检索(IR)技术对于从庞大数据集中提取相关信息至关重要。近年来,密集检索技术展现出了相比传统稀疏检索方法更加显著的效果。 现有的方法主要从点式重排序器中蒸馏知识,这些重排序器为文档分配绝对相关性分数,因此在进行比较时面临不一致性的挑战。…

School New Competition WP

试验一下博客园的基础功能,顺便把学校战队招新赛的Wp传一下, alpaca_search: 直接burp爆破把密码搞出来,在burp多抓几次包会在正确的包里发现一个新的cookie名count,count记录了正确的值 ,然后把它改成999再多发几次包,发到正确的那一个后就拿到了flag RCE_ME!!! 题目直…