C++四种强制转换

1. static_cast(静态类型转换)

基本语法:目标类型=static_cast<目标类型>(源类型)

  • 用于基本数据类型之间的转换
  • 把空指针转换成目标类型的空指针
  • 把任何类型的表达式类型转换成void类型
  • 用于类层次结构中父类和子类之间指针和引用的转换。
    这边主要讲加粗的这两种情况以及转换的安全性
//语法: static_cast<目标类型>(待转换对象)
	//基本数据类型转换
	char a = 'A';
	double c = static_cast<double>(a);

	//父类转子类,下行转换,不安全可能访问越界
	Base *b = new Base;
	Son *s = static_cast<Son*>(b);

	//子类转父类,上行转换,安全。
	Son*s2 = new Son;
	Base *b2 = static_cast<Base*>(s2);

	//类型转换过程中并没有声明Base类和other类的继承关系,无法使用类型转换
	/*other *other1 = new other;
	Base *b3 = static_cast<Base*>(other1);*/

但是若发生多态则不论上下转换都是安全的,因为多态new出来的空间足够大,访问操作不会越界

2. dynamic_cast(动态类型转换)

基本语法:目标类型=dynamic_cast<目标类型>(源类型)
用法与静态的类似,但是更为严格,不能支持基本数据类型之间转换了,比如以下就会出错:
基本数据类型
char a = ‘A’;
double c = dynamic_cast(a);

//语法: dynamic_cast<目标类型>(待转换对象)
	//基本数据类型转换,不支持
	char a = 'A';
	double c = dynamic_cast<double>(a);

	//父类转子类,下行转换,不安全可能访问越界,不支持
	Base *b = new Base;
	Son *s = dynamic_cast<Son*>(b);

	//子类转父类,上行转换,安全,支持
	Son*s2 = new Son;
	Base *b2 = dynamic_cast<Base*>(s2);

	//类型转换过程中并没有声明Base类和other类的继承关系,无法使用类型转换,更不支持
	/*other *other1 = new other;
	Base *b3 = dynamic_cast<Base*>(other1);*/

同样的但是若发生多态则不论上下转换都是安全的,因为多态new出来的空间足够大,访问操作不会越界

C++中层次类型转换中无非两种:上行转换和下行转换
对于上行转换,static_cast和dynamic_cast效果一样,都安全;对于下行转换:你必须确定要转换的数据确实是目标类型的数据,即需要注意要转换的父类类型指针是否真的指向子类对象,如果是,static_cast和dynamic_cast都能成功;如果不是static_cast能返回,但是不安全,可能会出现访问越界错误,而dynamic_cast在运行时类型检查过程中,判定该过程不能转换,返回NULL。

3. const_cast(去const属性)

基本语法:目标类型=const_cast<目标类型>(源类型)

struct SA {
	int i;
};
void main()
{
	const SA ra;
	SA &rb = const_cast<SA&>(ra);
	rb.i = 10;
 	while (1)
	{
	}
}

4. reinterpret_cast(不相关类型的转换)

基本语法:目标类型=reinterpret_cast<目标类型>(源类型)
在上面的例子中,不相关类型使用static_cast是不可以转换的.
例如:
int p = static_cast<int*>(i);
但是可以通过reinterpret_cast来进行转换.
例如:
int* p = reinterpret_cast<int*>(i);
建议:尽量避免使用强制类型转换。

特别是在使用reinterpret_cast时,我们发现此类强制转换总是非常危险的。相似的,使用const_cast也总是预示着设计缺陷。static_cast与dynamic_cast也不应频繁使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LV小猪精

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

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

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

打赏作者

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

抵扣说明:

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

余额充值