c++中的4种强制类型转换
c语言的强制类型转换:
int k = 5 % (int)3.2;
//or
int k = 5 % int(3.2);//函数风格类型转换
c++的强制转换格式:
xxx_cast<type>(express);
static_cast
静态转换,编译时执行,与c中的强制类型转换差不多。
可以用于:
-
相关类型转换如整数和实数转换
double f = 100.1f; int i = (int) f; //c style int i2 = static_cast
(f); //c++ style -
子类转换成父类
class A { }; class B : public A { }; int main() { B b; //子转父可以,反之不行 A a = static_cast(b); return 0; }
-
void *
与其他类型指针的转换int i = 10; int * p = &i; void * q = static_cast
(p); int * db = static_cast (q);
不可用于:
-
指针类型的转换如
int *
转double *
等double f = 100.0; double * pf = &f; int * i = static_cast
(pf); //error float * fd = static_cast (pf); //error
dynamic_cast
运行时类型识别和检查 runtime
进行父类型转子类型。代价大,保证安全性
const_cast
去除指针或者引用的const属性。只能用于此
编译时进行
const int ai = 90;
int ai2 = cosnt_cast<int>(ai); //error ai不是指针或引用
const int * pai = &ai;
int * pai2 = const_cast<int *>(pai); //yes
*pai2 = 120; //未定义行为,实际上是const的
如果本来就是常量而强硬去掉并写入,是一种未定义行为。除非原来不是常量,后来被变为常量,这是我们可以用const_cast给他变回去并写入。
不能改变表达式类型,需要用static_cast改。
当用到它时,往往意味着设计上的缺陷。
reinterpret_cast
编译时执行。处理无关类型的转换,随便转。
用于:
-
整型地址转换成指针,一种类型指针转换成另外一种类型的指针
-
指针类型转换成整型
int i = 10; int * pi = &i; int * p2 = reinterpret_cast
(&i); char * pc = reinterpret_cast (pi);
非常危险的转换,安全性差
()