一 C语言中存在着两种类型转换:
隐式转换和显式转换
隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成
char ch; int i = ch;
显示转换:在类型前增加 :(Type)变量 对变量进行的转换。用户显式增加
char *pc = (char*)pb; void *ps = (void*)pa;
二 C++中的类型转换
通过这两种方式,C语言中大部分的类型转换都可以顺利进行。
至于能不能进行转换,转换后的结果如何,编译器不管需要用户自己去控制。
C++继承了C中的隐式和显式转换的方式。但这种转换并不是安全和严格的,
加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字。(C++是强类型语言)
(static_cast,dynamic_cast,const_static,reinterpret_cast)
1 static_cast
(1)用于基本的数据类型转换(char,int),及指针之间的转换
test_enum type = test_enum_1; char a ; int b = static_cast<int>(a); char c = static_cast<char>(b); type = static_cast<test_enum>(b); char* pa = NULL; int *pb = (int*)pa; //int *pb = static_cast<int*>(pa); //error //pa = static_cast<char*>(pb) //error
char *pc = (char*)pb; //char *pc = static_cast<char*>(pb); //error void *p = static_cast<void*>(pa); pb = static_cast<int*>(p); pc = static_cast<char*>(p);
(2)类层次中基类与子类成员函数指针的转换
class A { public: void set(){} }; class B:public A { public: void set(){} }; typedef void (A::*PS_MFunc)(); //指向类A的成员函数指针 PS_MFunc func = &A::set; func = static_cast<PS_MFunc>(&B::set); //基类指向子类成员函数指针,必须进行转换
(3)类层次结构中基类与子类指针或引用之间的转换
上行转换:子类指针或引用转换成基类表示——安全
下行转换:基类指针或引用转换成子类表示——危险(没有动态类型检查)
class A { }; class B:public A { }; class C:public A { }; class D { }; A objA; B objB; A* pObjA = new A(); B* pObjB = new B(); C* pObjC = new C(); D* pObjD = new D(); objA = static_cast<A&>(objB); //转换为基类引用 objA = static_cast<A>(objB); objB = static_cast<B>(objA); //error 不能进行转换 pObjA = pObjB; //right 基类指针指向子类对象 //objB = objA; //error 子类指针指向基类对象 pObjA = static_cast<A*>(pObjB); //right 基类指针指向子类 pObjB = static_cast<B*>(pObjA); //强制转换 OK 基类到子类 //pObjC = static_cast<C*>(pObjB); //error 继承于统一类的派生指针之间转换 //pObjD = static_cast<D*>(pObjC); //error 两个无关联之间转换
2 dynamic_cast
(1)继承关系的类指针对象或引用之间转换
class A { }; class B:public A { }; class C:public A { }; class D { }; A objA; B objB; A* pObjA = new A(); B* pObjB = new B(); C* pObjC = new C(); D* pObjD = new D(); //objA = dynamic_cast<A>(objB); //error 非引用 objA = dynamic_cast<A&>(objB); //objB = dynamic_cast<B&>(objA); //error A 不是多态类型不能转换 若有虚函数则可以进行转换 pObjA = dynamic_cast<A*>(pObjB);