分享

C++类型转换总结

 semo_zhang 2012-12-26

#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;
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多