//函数类型强制类型转换
//这是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真的很好用,符合规范的用,还是很好的,装逼必备