隐式类型转换
//系统自动转换
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++风格