类型转换
C++提供了4种类型转换,分别处理不同的场合应用
static_cast 静态类型转换。
可以转换基本数据类型和具有继承关系的对象指针或引用
static_cast<目标类型> (标识符)

reinterpret_cast重新解释类型转换。
仅仅重新解释类型,但没有进行二进制的转换:
1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
3. 最普通的用途就是在函数指针类型之间进行转换。
4. 很难保证移植性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #define _CRT_SECURE_NO_WARNINGS #include<iostream>
using namespace std;
typedef void(*VFun)(int, int); typedef double(*DFun)(int, int); int main(char *argv[], int argc) { VFun vf = NULL; DFun df = reinterpret_cast<DFun>(vf);
return 0; }
|
dynamic_cast 子类和父类之间的多态类型转换。
dynamic_cast<目标类型> (标识符)
只能转换具有继承关系的指针或引用,会做类型安全检查
只能从子类转父类,因为一般子类内存空间是大于等于父类的,如果子类内存空间大于父类,把父类指针转换成子类指针,会越界处理,所以不安全。
如果转换失败返回NULL

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #define _CRT_SECURE_NO_WARNINGS #include<iostream>
using namespace std;
class Base { private: char * mName; };
class Son : public Base { private: int age; };
class Animal { char * mName; };
int main(char *argv[], int argc) { Base * pBase = NULL;
Son * pSon = NULL;
Animal * pAnimal = NULL;
pBase = dynamic_cast<Son *>(pSon);
return 0; }
|
const_cast 去掉const属性转换。
const_cast<目标类型>(标识符)
目标类类型只能是指针或引用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #define _CRT_SECURE_NO_WARNINGS #include<iostream>
using namespace std;
class Base { private: char * mName; };
class Son : public Base { private: int age; };
class Animal { char * mName; };
void test() { int a = 10; const int & b = a; int &c = const_cast<int &>(b);
c = 20;
cout << a << endl; cout << b << endl; cout << c << endl;
}
void test02() { Base * a = NULL; const Base *b = a; Base * c = const_cast<Base *>(b); c = new(Base);
cout << "===========================" << endl; cout << a << endl; cout << b << endl; cout << c << endl;
delete c; c = NULL; }
int main(char *argv[], int argc) { test();
test02();
return 0; }
|