c++风格强制类型转换: static_cast, reinterpret_cast, reinterpret_cast,const_cast

隐式类型转换

//系统自动转换
	int m = 3 + 45.6;
	double n = 3 + 45.6;

显式类型转换

也叫强制类型转换

	//c语言风格强制类型转换
	//int k = 5 % 3.2\; //语法错误
	int k = 5 % (int)3.2; //编译通过
	int k = 5 % int(3.2); //另一种写法,也OK

c++中,强制类型转换分为4中,4中类型转换用于不同的目的,C++中为了提供更好的类型检查机制, 方便代码书写和维护.

C++写法

//static_cast, dynamic_cast, const_cast, reinterpret_cast
//通用形式
//强制类型转换名<type>(express);
//强制类型转换名 : 以上四个中一种
//<type> : 转换的目标类型
//express : 你要转换的值 (你要转换的是谁)

static_cast

静态转化
可以理解为"正常转换" ,编译时候就会进行类型转换的检查, 代码中要保证转换的安全性和正确性, static_cast含义跟C语言中的强制类型转换差不多,下面是例子

	//a) 相关类型转换
	double f = 100.34f;
	int i = (int)f;  //c
	int i = static_cast<int>(f); //c++

	//b) 子类转父类, 也可以用static_cast;
	class A {};
	class B : public A {};
	B b;
	A a = static_cast<A>(b); //子类转成父类的对象, 可以
	//A a;
	//b = static_cast<B>(a);     //错误, 父类不能转子类
	//c) void* 与其他类型指针之间的转换
	int i = 10;
	int* p = &i;
	void* q = static_cast<void*>(p); //int*  转成void*
	int* db = static_cast<int*>(q);  //void* 再转成 int*

不能转的情况

//a)一般不能用于指针类型之间的转换
	double f = 100.0f;
	double* pf = &f;
	//int *i = static_cast<int *>(pf);  //不可以,编译不通过
	//float* fd = static_cast<double*>(pf);  //不可以

dynamic_cast

主要应用于运行时类型识别和检查,这里与static_cast不同的地方就是static_cast是编译时检查
主要用来父类型和子类型之间转换用
已长篇幅补充在此链接:
链接地址,dynamic_cast

const_cast

去除指针或者引用的const属性, 改转换能够将const性质转换掉
编译时进行类型转化

	const int a = 90;

	//int ai2 = const_cast<int>(a);  //a 不是指针也不是引用
	const int* pai = &a;
	int* b = const_cast<int*> (pai);  //OK
	*b = 120; //这种赋值,不要这么写,属于未定义行为, 打印出来不是120

reinterpret_cast

编译时进行类型转化
reinterpret:重新解释
将操作数内容解释为另一种不同的类型,处理无关类型转换,等于说可以乱转,很随意
一般常用语如下
1.整型(地址)转指针
按照转换后内容重新解释内存中的内容;
2.指针类型转整型

	int i = 10;
	int* p1 = &i;
	int* p2 = reinterpret_cast<int*> (&i);    //地址转指针
	char* pc = reinterpret_cast<char*>(p1);  //语法对,但不能这么用

功能强大,但是是一种危险的类型转换,随便乱转也并无意义

总结

(1)强制类型转换,不建议使用,强制类型转换能够抑制编译器报错
(2)reinterpret_cast很危险,使用const_cast意味着设计缺陷
(3)不要使用c语言风格类型转换,建议使用c++风格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值