首页 > 编程语言 >C++ 类型强转

C++ 类型强转

时间:2024-10-05 21:00:41浏览次数:8  
标签:强转 转换 C++ cast Base 类型 const 指针

  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那样在编译时进行严格的类型关系检查。

标签:强转,转换,C++,cast,Base,类型,const,指针
From: https://www.cnblogs.com/androidsuperman/p/18448464

相关文章

  • C++ 模板详解(一)
    C++模板模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不同的函......
  • c++之auto关键字的注意点(涉及decltype)
    1.基本规则auto会根据初始化表达式的类型推导出变量的类型。如果初始化的是值类型,auto推导出的也是值类型。如果初始化的是引用类型,auto会忽略引用类型,并推导出被引用对象的类型。如果初始化表达式是常量(const),且auto不是引用类型,推导出的类型会去掉const限定符。vo......
  • 欧拉筛解释(含C++代码)
    intprime[MAXN];//质数列表boolisPrime[MAXN];//标记是否为质数(0表示是,1表示不是)intcnt;//prime表长/*对于任意合数m,可写作m=p*k(p为m的最小质因子,k为m/p,m、k>1且为整数,k>p(p为最小质因子,k为其它几个质因子相乘,每个质因子都比p大,所以k>p))*///欧拉筛(使每个合数......
  • C++ 命名空间
    概念在C++中,命名空间(namespace)是一种将代码中的标识符(如变量名、函数名、类名等)进行分组和隔离的机制。它可以避免不同代码模块之间的命名冲突,提高代码的可维护性和可移植性。命名空间的定义基本语法为:namespace命名空间名称{//在这里定义变量、函数、类等}例......
  • C++-练习-52
    题目:这个练习让您编写处理数组和结构的函数,下面是程序的框架,请提供其中描述的函数,以完成该程序#include<iostream>usingnamespacestd;constintSLEN=30;structstudent{charfullname[SLEN];charhobby[SLEN];intooplevel;}; intgetinfo(studentpa[],i......
  • vs code如何配置C/C++环境,实现完美运行.c/.cpp文件,以及终端乱码问题
    环境配置在VisualStudioCode(VSCode)中安装了C/C++ExtensionPack后,你可以通过以下步骤来运行C++文件:安装编译器配置编译任务:在VSCode中,你可以创建一个编译任务来编译你的C++文件。这通常通过创建一个tasks.json文件来完成。你可以通过以下步骤创建这个......
  • Redis数据类型, Redis主从哨兵和集群(将数据导入集群) ubuntu使用
    2.5Redis常用命令2.5.1INFO显示当前节点redis运行状态信息(可以做监控用)#列出所有127.0.0.1:6379>info#列出具体块127.0.0.1:6379>infoMemory2.5.3SELECT切换数据库,相当于在MySQL的USEDBNAME指令注意:在Rediscluster模式下不支持多个数据库,会出现下......
  • 南沙C++信奥赛陈老师解一本通题: 1828:【02NOIP提高组】均分纸牌
    ​ 【题目描述】有n堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为nn的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n−1的堆上;其他堆上取的纸牌,可以移到相......
  • 1.1第一个C++程序
    1.启动Dev-C++        启动界面如图所示:2.新建源代码        单击文件[F]——新建[N]——源代码[S]3.输入代码        在右侧编辑区输入以下代码#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"HelloWorld!"<<endl;......
  • PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
    在PbootCMS中增加可允许上传的文件类型(例如 webp、mov 等文件格式),需要在多个地方进行配置。以下是详细的步骤:操作步骤1.修改 config.php 文件首先需要修改 config.php 文件,增加允许上传的文件类型。打开 config.php 文件打开 config.php 文件,通常位于 /config......