C++基础的不能再基础的学习笔记——类型转换

本文详细介绍了C++中的类型转换,包括隐式转换和显示转换两大类。隐式转换涉及算术转换、数组转换成指针及指针转换等内容;显示转换即强制类型转换,通过static_cast、dynamic_cast、const_cast和reinterpret_cast四种方式进行。

类型转换

一、隐式转换
int ival = 3.14 + 3;

在执行上述语句时,编译器先将int类型的3转换为double类型,之后相加,再将所得结果转换为int类型初始化ival。

显然,这里的类型转换无须程序员的介入,称之为隐式转换

1. 算术转换

算数转换就是将一种算术类型(宽度小的)转换为另一种算术类型(宽度大的)。

  • 整型提升

    整型提升负责把 小整数类型 转换成 较大的整数类型

    对于bool、char、signed char、unsigned char、short、unsigned short,只要它们所有可能的值都能存在int里,就会转化成int类型,否则转换成unsigned int类型。

2. 其他隐式类型转换

① 数组转换成指针

在大多数用到数组的表达式中,数组 自动转换成 指向数组首元素的指针。

② 指针的转换

常量整数值0 和 字面值nullptr 可以转换为任意类型的指针。

而指向任意非常量的指针能转换成 void*,指向任意对象的指针能转换为const void*。

③ 转换成bool类型

若算术类型和指针类型值为0,则为false,值为1,则为true。

二、显示转换

显示转换也就是我们所说的 强制类型转换

一个命名的强制类型转换有如下格式:cast-name <type> (expression)

其中, type是目标类型expression是要转换的值,而cast-name指定了执行的是哪种转换(共 static_cast、dynamic_cast、const_cast、reinterpret_cast 四种)。

  • static_cast

    任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

    int i = 3, j = 2;
    double result = static_cast<double>(i) / j;

    当将一个较大的算术类型赋值给较小的算术类型时,编译器会给出警告,但如果用了static_cast显示转换,警告则会消失。

    long a = 100000;
    int b = static_cast<int>(a);
    • dynamic_cast

      dynamic_cast支持运行时类型识别,我们会在后面详细介绍。

    • const_cast

      const_cast只可改变底层const,将常量对象变为非常量对象。

    • reinterpret_cast

      这是一个非常有风险的类型转换。

      int *i;
      char *c = reinterpret_cast<char *>(i);
      
      string str(c);  //错误

      上述代码中,用int类型的地址初始化了char类型指针,但是C指向的真实对象是一个int并不是char类型。因此,当我们错误地使用C而编译器不给出警告时,会引起很严重的后果。


由此,在代码中,坚决不要出现隐式转换,尽量杜绝出现显示转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值