C++的显示转换(第一次)

来源:互联网 发布:大数据广告投放 编辑:程序博客网 时间:2024/04/30 03:40

      C++当中的转换复杂,容易混淆,更容易出错,今天对<<C++编程思想>>进行了相关的阅读与理解,现记录初步的理解如下:

      C++当中的显示类型转换的目的就是要告诉编译器:我来接管你的类型检查,你少管我,我现在已经长大了,做的事情是不是合法的我自己知道,你应该把我当成年人看待。所以,即使我做错了转换,编译器也不会报错或者是提出警告,这个时候更要考察作为程序员的我们的检查能力了。

      (1)static_cast

      它用于明确定义的转换,包括典型的非强制转换窄化转换使用void*的强制转换隐式类型转换类层次的静态定位

      注意,它不可用在没有继承关系的对象指针之间互换,这个时候可以借助于void*的转换

      void func(int i) {}

      int main(){

         int i=0x7fff;

         long l;

         float f;

 

         //非强制转换

         l=i;

         f=i;

         l=static_cast<long> (i);//同上边的等价

         f=static_cast<float> (i);//同上边等价

 

         //窄化转换

         i=l;//可能会丢失信息

         i=f;

         i=static_cast<int>(l);

         i=static_cast<int>(f);


        //使用void*的强制转换

        void *vp=&i;

        float *fp=(float*)vp;//一个危险的转换

        fp=static_cast<float*>(vp);//一个危险的转换,但是我们这里使用的

                                  //是显示的方式,便于调试

        

        }

      

       (2)const_cast

       它唯一允许的转换:若从const转换为非const或从volatile转换为非volatile,可以使用const_cast.

       需要注意的是:const_cast转换的源均为地址型值。

       (3)reinterpret_cast

        它是一种最不安全的转换机制,最有可能出现问题了。它的工作原理为:将对象假设为模式,仿佛是一种完全不同的类型的对象。它是低级的位操作。

        (4)dynamic_cast

        一种安全类型向下转换操作。当使用dynamic_cast试着向下类型转换一个特定的类型时,仅当类型转换是正确的并且成功的时候,返回值是一个指向所需类型的指针,否则它将返回0来表示这并不是正确的类型。

     

      并且要注意的是,使用dynamic_cast的时候,必须对一个真正多态的层次进行操作(即该类应该含有虚函数),因为dynamic_cast使用了存储在VTABLE当中的信息以判断实际的类型。

       但是,dynamic_cast运行时较static_cast的开销更大,我们可以通过static_cast来代替dynamic_cast,只要我们知道处理的是何种类型。