C/C++:强制类型转换 —— const_cast、static_cast、reinterpret_cast、dynamic_cast

本文详细介绍了C++中的类型转换,包括强制类型转换和隐式类型转换。强制类型转换有const_cast、static_cast、reinforce_cast和dynamic_cast;隐式类型转换涵盖算术相关类型转换、指针转换以及指向变量的指针/引用到指向常量的指针/引用的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、强制类型转换

1、const_cast

        用于去掉底层 const,将实参(常引用 / 指向常量的指针)转换为 普通引用和普通指针。反之是隐式转换。

const char *p;
char *ps = const_cast<char*>(p);

2、static_cast

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

        任何 不涉及 去掉底层const 的转换(显示 / 隐式)。多用于一般的显式转换,替代旧风格的显示转换(与通常的隐式转换相反的场所)。

//指针取回
char *p;
void *ps = p;                  //隐式转换
p = static_cast<char*>(ps);    //显示转换,转回 char,转成其他类型将引发错误

//关闭精度损失的警告
int a;
char c = static_cast<char>(a);

3、reinforce_cast

        很危险,尽量避免使用。为 运算对象的位模式 提供 较低层次上的重新解释底层二进制数值的拷贝,不做任何类型检查和转换。

//错误的转换,但是不会报错
int *pa;
char *pc = reinterpret_cast<char *>(pa);

4、dynamic_cast

        将 基类指针或者引用 转换为 派生类指针或者引用,在运行时识别类型,使用所绑定对象的动态类型。反之是隐式转换。

        不存在 基类对象 到 派生类对象 的转换,只能转指针或引用。

        向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。

Base *pb;
Derived *pd = dynamic_cast<Derived *> pb; 

二、隐式类型转换

1、算术相关类型转换

(1)、整形提升:小整形 提升为 大整形

(2)、布尔转换:非布尔 转换为 布尔

(3)、算术转换:小类型 统一为 大类型

(4)、无符转换:有符号 转换为 无符号。(在类型一样大小的时候,否则按 (3) 处理)

2、指针转换

(1)、数组 转换为 指针

(2)、非常量类型指针 转换为 无类型指针:Type * ---> void *

(3)、任何类型指针 转换为 指向常量的无类型指针:const Type * ---> const void*、Type * ---> const void*

3、指向变量的指针/引用 ---> 指向常量的指针/引用

(1)、Type * ---> const Type *

(2)、Type & ---> const Type &

 

精讲链接:

https://blog.youkuaiyun.com/u014450222/article/details/81428336

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值