DYF
我思故我在!

C++的类型转换函数

reinterpret_castconst_caststatic_castdynamic_cast 前三个类型转换是在编译时实现转换,dynamic_cast是在运行时进行类型转换的。

reinterpret_cast<new type>expression

const_cast<  new type>( expression)

static_cast<new type>(expression)

dynamic_cast<newtype>(expression)

 

1reinterpret_cast

reinterpret_cast将一个类型的指针转换为另一个类型的指针,它也允许从一个指针转换为整数类型。这种转换不用修改指针变量值数据存放格式(不改变指针变量),而是在编译时重新解释指针的类型(操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换)不能用于非指针类型的转换

1)转换一个指针为其它类型的指针,能够在非相关的类型之间转换

class A {};

class B {};

A * a = new A;

B * b = reinterpret_cast<B *>(a);

2)不能将const指针转换为非const        

         const int* point =&j;

        dm  =reinterpret_cast<double*>(point);

 3)不能用于非指针类型的转换

         int i; double j = 2.1

         j =reinterpret_cast<int>(j);

 4可以将一段buffer转成一个类的对象指针,或者反过来。

class A;

A a;

char* pBuffer = reinterpret_cast<char*> (&a);

 

  

2const_cast

const_cast用于const指针与普通指针间的相互转换(将一个const指针转换为对应指针类型的普通指针变量,也可以将一个普通指针变量转换为一个const指针)。不能将非常量指针变量转换为普通变量const转为非const,或者volatile转为非volatile)。

 

 

class C {};

const C *a = new C;

C *b = const_cast<C *>(a);

 

3static_cast

static_cast主要用于基本类型间的相互转换,和具有继承关系间的类型转换(将子类类型的指针转换为父类类型的指针,也能够转换父类类型的指针为它的子类类型的指针)。

   1)用于替代C风格的显式转换和各种类型指针到void*的转换

                    long b = (int) a;

           long b =static_cast<int>(a);

        2)用于父类到子类指针的转换

        3)不能在类层次外转换,所以static_cast比C方式转换安全。

        float x;

      Count<<static_cast<int>(x);//x作为整型值输出

 

4dynamic_cast

dynamic_cast只能在继承类对象的指针之间或引用的相互转换,在运行时动态转换。只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程会检查操作是否有效。指针间转换失败可以通过判断是否为null来判断,引用转换失败则抛出 bad_cast 异常。

  1只有类中含有虚函数才能用dynamic_cast,因其是依赖于VTable来工作的。

      2用于多态类型的转换,比如从父类到子类的转换。

      3当明确知道子类的类型时,可用static_cast转换,其效率高点。

   

         class Car;

         classCabriolet:public Car{};

         classLimousline:public Car{};

         voidf(Car *cp)

         {

              Cabriolet*p = dynamic_cast< Cabriolet > cp;

         }

posted on 2012-06-28 23:03  o(∩_∩)o...  阅读(3597)  评论(0编辑  收藏  举报