• C++----类型转换


    C语言类型转换

    • 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
    int i = 1;
    // 隐式类型转换 -- 相近类型/相关类型 -- 意义相似
    double d = i;
    printf("%d, %.2f\n", i, d);
    
    • 1
    • 2
    • 3
    • 4
    • 显式类型转化:需要用户自己处理
    int* p = &i;
    // 显示的强制类型转换 -- 不相近类型/不相关类型
    int address = (int)p;
    
    • 1
    • 2
    • 3
    • 整形提升
      int遇到unsigned int产生中间变量将int整形提升为unsigned int再进行比较,死循环
    size_t pos;
    cin >> pos; // 0
    int n = 5;
    while (n >= pos) // 整形提升,本质就是隐式类型转换
    {
    	cout << n << endl;
    	--n;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    C++类型转换

    意义:

    1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
    2. 显式类型转换将所有情况混合在一起,代码不够清晰

    static_cast

    相关类型的转换:static_cast对应C语言的隐式类型转换
    static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换
    在这里插入图片描述
    看到static_cast就标识是相关类型转换
    在这里插入图片描述
    不相关类型不行

    reinterpret_cast

    不相关类型转换:reinterpret_cast
    reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型
    在这里插入图片描述

    const_cast

    const_cast最常用的用途就是删除变量的const属性,方便赋值,虽然可以直接(int)强制类型转换,但是C语言不规范*
    在这里插入图片描述
    但是我们看到a未被修改,这时编译器优化,改为volatile const int a = 2;直接从内存里取

    在这里插入图片描述
    注意:const变量可以通过取地址修改

    dynamic_cast

    dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

    • 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)----切割/切片
    • 向下转型:父类对象指针/引用-

    子类指针/引用(用dynamic_cast转型是安全的)
    注意

    1. dynamic_cast只能用于含有虚函数的类
    2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

    例如:

    class A
    {
    public:
    	virtual void f() {}
    private:
    	int _a = 1;
    };
    
    class B : public A
    {
    public:
    	int _b = 1;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • pa如果是指向父类对象,严格来说是不能转的,因为存在风险,访问时存在越界风险
      在这里插入图片描述
    • pa如果是指向子类对象,可以转换,是安全的
      在这里插入图片描述
    • 如果使用c的强制类型转换,那么这里是不安全的,无法识别上面的两种情况,建议是使用dynamic_cast,他是安全的。如果是第2种情况可以转换成功,第1种情况转换失败,返回NULL
      成功:
      在这里插入图片描述
      失败:
      在这里插入图片描述

    explicit

    explicit为清晰的;明确的之意.顾名思义,关键字explicit可以阻止隐式转换的发生.
    考:C++ 中explicit关键字详解

  • 相关阅读:
    模拟开关与多路复用器
    从URL输入到页面展现到底发生什么?
    在地图上画出多个点
    echarts画电压线
    【前端】使用json-server报错
    6.19作业
    Excel 常用技巧(三)
    Spring Boot 内置工具类 ObjectUtils
    spring cloud alibaba - seata分布式事务记录
    python中的函数(全)
  • 原文地址:https://blog.csdn.net/qq_41420788/article/details/126649434