类型转换 “变形记”:C 和 C++ 的显式与隐式转换详解

一、隐式类型转换 —— 编译器的 “自动翻译官”

隐式转换是编译器悄悄完成的类型转换,无需手动干预,常见于赋值、运算、传参等场景。

1. 赋值时的 “悄悄变身”

  • 例 1:小数转整数,丢失小数部分

    c

    运行

    double pi = 3.1415;
    int int_pi = pi;  // double隐式转int,int_pi = 3
    
  • 例 2:int 转 char,取低字节值

    c

    运行

    int num = 97;  // 'a'的ASCII值
    char c = num;  // int隐式转char,c = 'a'
    

2. 算术运算时的 “统一标准”不同类型运算时,“小范围类型” 自动转 “大范围类型”,避免数据丢失。

  • 例:int 与 float 相加,int 先转 float

    cpp

    运行

    int a = 2;
    float b = 1.5f;
    float sum = a + b;  // a隐式转float(2.0f),sum = 3.5f
    

3. 函数传参 / 返回时的 “自动适配”

  • 例 1:实参 int 转形参 double

    cpp

    运行

    void print_double(double x) { /* ... */ }
    print_double(10);  // int 10隐式转double 10.0
    
  • 例 2:返回值 double 转 int

    cpp

    运行

    int get_int() {
        return 5.9;  // double 5.9隐式转int 5
    }
    
二、显式类型转换 —— 手动 “指挥” 类型变形

当隐式转换不符合预期时,需手动指定转换方式。C 和 C++ 的显式转换语法不同,C++ 新增了更安全的转换运算符。

1. C 语言的 “简单粗暴” 转换:(目标类型) 表达式

直接用括号强制转换,编译器几乎不检查安全性,可能隐藏风险。

  • 例 1:double 强制转 int

    c

    运行

    double score = 95.5;
    int int_score = (int)score;  // 结果95
    
  • 例 2:超出范围的转换

    c

    运行

    int big_num = 300;  // char范围通常是-128~127
    char c = (char)big_num;  // 结果可能是44,存在风险
    
2. C++ 的 “智能转换工具”:4 种标准转换符

C++ 提供 4 种转换运算符,分工明确,安全性更高,推荐优先使用。

  • static_cast:常规转换小能手用于 “相关类型” 转换,编译时检查合理性,不支持无关类型。

    • 例 1:基本类型转换

      cpp

      运行

      float f = 3.14f;
      int i = static_cast<int>(f);  // 结果3
      
    • 例 2:父类指针转子类指针

      cpp

      运行

      class Parent {};
      class Child : public Parent {};
      Parent* p = new Child;
      Child* c = static_cast<Child*>(p);  // 编译通过
      
  • dynamic_cast:多态安全卫士仅用于含虚函数的 “多态类”,运行时检查转换是否安全,失败返回 nullptr。

    • 例:安全的子类指针转换

      cpp

      运行

      class Animal { virtual void eat() {} };  // 含虚函数,多态类
      class Dog : public Animal { void bark() {} };
      class Cat : public Animal { void meow() {} };
      
      Animal* a = new Dog;
      Dog* d = dynamic_cast<Dog*>(a);  // 成功,d指向Dog对象
      Cat* c = dynamic_cast<Cat*>(a);  // 失败,c = nullptr
      
  • const_cast:去 const 小钥匙仅用于移除指针 / 引用的 const 属性,不能直接修改 const 变量的值。

    • 例:修改非 const 变量的 const 引用

      cpp

      运行

      int x = 10;
      const int& ref_x = x;
      int& non_const_ref = const_cast<int&>(ref_x);
      non_const_ref = 20;  // x的值变为20,安全
      
  • reinterpret_cast:二进制重解释器直接按二进制位重新解释数据,不做类型检查,仅用于底层场景。

    • 例:int 指针转 long

      cpp

      运行

      int a = 10;
      long addr = reinterpret_cast<long>(&a);  // 将a的地址转为long值
      
三、总结:转换方式怎么选?

表格

场景推荐转换方式安全性
基本类型 / 相关指针转换C++ static_cast较高
多态类指针 / 引用转换C++ dynamic_cast最高
移除 const 属性C++ const_cast谨慎使用
底层二进制转换C++ reinterpret_cast最低
兼容 C 代码C 语言 () 转换
谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值