C++基础知识学习,四种强制类型转换,static_cast,dynamic_cast,const_cast,reinterpret_cast

	//函数类型强制类型转换
	//这是c的转换,只不过C++支持罢了
	int a = int(5.5);

c++强制类型转换,4种

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
    使用方法
    强制类型转换名<targetType>(sourceValue);
static_cast

static_cast:静态转换,就理解成正常转换,编译的时候就会检查,代码中要保证能转换,一般的C风格都能用这个代替

	int b = static_cast<int>(12.3f);
	//特殊用法
	//1、子类转成父类,也可以用这个
	class A {};
	class B : public A {};
	B bc;
	A ab = static_cast<A>(bc);
	//2、void *与其他指针之间的转换
	int c = 1;
	int* p = &c;
	void* myVoidIter = static_cast<void*>(p);
	int* q = static_cast<int*>(myVoidIter);

	//不可用的情况
	//1、int *->float*/double*,float*->double*	,节间寻址方法不一样
dynamic_cast

dynamic_cast:主要在运行时类型识别和检查,主要用于父类型和子类型之间转化用,以后详细讲

const_cast

取出指针/引用的const性质,编译时进行
虽然语法上正确,但是这是一种未定义行为(不确定结果的行为,debug也没用)

const int d = 9;
const int* dIter = &d;
int* noConstDIter = const_cast<int*>(dIter);
*noConstDIter = 12;	//就不应该这样写,这是未定义的一种行为
//debug时显示的是12,输出就是9,奇哉怪也
cout << d << endl;
cout << *dIter << endl;
cout << *noConstDIter << endl;
reinterpret

编译时
重新解释,无关类型的转换,很随意的转化
一种指针转换成另一种类型的指针,按照转换后的内容重新解释,非大佬人士不要用

	int f = 10;
	int* p1 = &f;
	//int*转化为char*,不服不行
	char* cp1 = reinterpret_cast<char*>(p1);
	//转化为万能指针
	void* vp1 = reinterpret_cast<void*>(p1);
	cout << *cp1 << endl;
	cout << *(reinterpret_cast<int*>(vp1)) << endl;

总结

  • 1、都不建议执行,强制类型转换会抑制编译器报错
  • 2、目的就是认识就行了
  • 3、reinterpret_cast危险,使用这个东西就是意味着你的设计有缺陷
  • 4、如果真的需要,就用这四种,就不要使用c语言风格的了

reinterpret真的很好用,符合规范的用,还是很好的,装逼必备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值