#include "stdafx.h" /* c++类型转换复习 c风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统都是: TYPE b = (TYPE)a;
c++风格的类型转换提供了4中转换操作符来应对不同的场合。 const_cast 去cosnt属性转换。 static_cast 静态类型转换 如:int转换为char。 dynamic_cast 动态类型转换 子类和父类的多台类型转换。 reinterpret_cast 仅仅是重新解释类型,但是没有进行二级制的转换。
*/ int doSomething(){ printf("hello world\n"); return 0;} int main(int argc, char* argv[]) {
//const_cast 去掉类型的const 或者volatile属性 typedef struct A{ int i; A() { i = 0; } }A; const A a;//a是const变量 不能重新赋值操作 内存中的数据是不允许修改的 //a.i =10;//这样做事非法的 A &b =const_cast<A&>(a);//这样去掉const属性以后 //顺便介绍下常量区这一概念 //常量区:这是一块比较特殊的储存区,里面放的是常量,不允许修改。通过其他非正当的手段是可以修改该值的。 //像上面这种方法是可以修改常量区的内存数据 b.i = 10;//b指向a的地址是允许修改的 printf("%d",a.i);
//static_cast类似于c风格的强制转换。无条件转换,静态类型转换。 //1、基类和子类之间的转换:其中子类指针转换成父类指针式安全的;但是父类指针转换成子类指针式不安全的(基类和子类的动态转换建议用dynamic_cast转换) //2、基本数据类型转换。enum、struct、int、char、float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。 int na = 20; float fb = static_cast<float>(na); printf("%f",fb); //float * fc = static_cast<float *>(&na);//这是无关类型转换 //3、把空指针转换成目标类型的空指针 void * pVoid = static_cast<void *>(&na); //4、把任何类型的表达式转换成void类类型 //5、static_cast 不能去掉const类型的const、volitale属性(只能用const_cast转换)
//dynamic_cast 有条件的转换,动态类型转换,运行时类型安全检查(转换失败返回NULL) //1、安全的基类和子类之间的转换。 //2、必须要有虚函数(没有虚函数和有虚函数调用同一个函数式两种情况,这个可以去看一下c++primer,针对这个问题具体 //研究下为什么会出现这样的情况了) //3、相同基类不同子类之间的交叉转换。但是结果是NULL
class Base { public: char c; void fun(){printf("%c",c);} };
class DriveBase:public Base { public: void fun(){printf("DriveBase");}
};
DriveBase * pDriveBase = new DriveBase; Base * pBase = dynamic_cast<Base *>(pDriveBase); Base * pBase2 = static_cast<Base *>(pDriveBase);
Base * pBase3 = new Base; //DriveBase *pDriveBase1 = dynamic_cast<DriveBase*>(pBase3);
//reinterpret_cast //仅仅是重新解释了内存中的数据,并没有进行二级制转换。 //1、转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。 //2、在比特位级别上进行转换。他可以把一个指针转换成一个整数。也可以把一个整数转换为一个 //一个指针(先把一个指针转换为一个整数,在把该整数转换成指针,还可以得到原先的指针值),注意不能将 //非32位的实例转换指针。 //3、最普通的用途就是函数指针之间的转换。 //4、很难保证移植性。
typedef void (*FUN)(); //FUN fun = &doSomething;这样类型不匹配了 FUN fun = reinterpret_cast<FUN>(&doSomething);//不同类型的函数指针的转换。 fun();
int na6 =500; char * pc = reinterpret_cast<char *>(&na6);//pc所指向的内存被解释为了char类型;这样会丢掉高位 static_cast 是不能进行的如此转换) //所以最后的值为-12 printf("pc = %d,na6 = %d",*pc,na6); //通过查看内存里面的比特位并未变
getchar(); return 0; }
|