C++四种强制类型转换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、static_cast

static_cast主要用于一种类型转化成另外一种类型

主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换
上行转化(把派生类的指针或引用转换成基类表示)是安全的
下行转化(把基类的指针或引用转换成派生类表示)不安全,并不像dynamic_cast有检测
2.用于基本类型的转化,例如int转化double
3.把空指针转化成目标类型空指针
4.把任意类型转化成void类型

二、dynamic_cast

首先dynamic_cast与其他三种强制类型转换不同的点在与,它是在运行时类型检查,而其他三种是在编译时处理的,其次dynamic_cast不能用与基本类型数据的强制转换

主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换,与static_cast不同的是dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。它会有一个安全措施,确保了安全性
2.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
PS: 基类中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

三、const_cast

弥补了static_cast无法转换const/volitale的不足,将expression的const/volitale属性移除,仅限于底层const属性.
需要注意的是:const_cast不是去除常量的const属性,而是去除指向常量的指针或引用的属性
举个例子:

int main()
{
    const int a = 7;
    const int* p = &a;
    int* q = const_cast<int*>(p);
    *q = 20; //通过q写值是未定义的行为
    printf("q=%d\n", *q);
    printf("a=%d\n", a);
    cout << "q=" << q << endl;
    cout << "a=" << &a << endl;
}

a是常量,所以无法改变它的值,const_cast只是改变指向常量指针的常量性,通过地址改变其值

在这里插入图片描述
但是出现以下的状况,q指向地址和a的地址相同,*q改变了a的值,但是显示出来却是没改变,一个猜想是可能是编译器的问题,本质上是已经改变了,我们来通过调试来看一看。
在这里插入图片描述
通过调试我们发现确实是这样,内存以及改了,但是显示出来还是没改的样子
在这里插入图片描述

四、reinterpret_cast

reinterpret_cast 允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。
PS:
1.reinterpret_cast 运算符可用于 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,这本身并不安全,但可以通过编译
2. reinterpret_cast 的本质作用是重新定义内存数据的解释方式,而不进行任何二进制转换

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chenshida_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值