1. 转换相关的关键字

   c++有哪4个类型转换相关的关键字?各有什么特点,应该在什么场合下使用? 

答: 相对于c风格的强制类型转换: (摘自:http://blog.sina.com.cn/s/blog_4b20940201013ryp.html)

   (T) expression; // cast expression to be of type T

        或 T(expression) 

       c++风格(新风格)的强制转换分为4中类型: 分别为

              I. const_cast<>() :  一般用于消除对象的常量性。即:将一个const对象 转换为 非const 类型对象。 它是C++风格中进行此类转换的唯一方法。

                class C{};

               const C* a = new C;

                C *b = const_cast<C*> (a); , 其他三种操作都不能修改一个对象的常量性。

             II. static_cast<>():  应用最广,最接近于c风格的类型转换,可以用于除const对象外的其他类型转换。转换对象包括指针、基础类型。但被转换的父类没有检查是否与目的类型一致。

              class Base{};

     class Derived: public Base{};

      Base *a = new Base;

     Derived* b = static_cast<Derived* > (a);

             double d = 3.1415;

      int i = static_cast<int> (d); // 基本类型的转换

             III. dynamic_cast<>():   只用于对象的指针和引用。把一个父类型向下转为子类型时(即隐式转换的相反过程),该操作会在运行时检查 返回的是否一个有效的完整对象,若不是,则返回NULL.

           class Base{virtural dummy(){}};

    class Derived : public Base{};

      Base* b1 = new Derived;

    Base* b2 = new Base;

           Derived* d1 = dynamic_cast<Derived* > (b1); // succeeds

           Derived* d2 = dynamic_cast<Derived* > (b2); // fails: return NULL

    IV. reinterpret_cast<>() : 简单的将一个指针的值进行二进制拷贝到别的指针,不做任何类型的检查和转换。

    class A{}

          class B{}

           A* a = new A;

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

     新风格的好处:

        (1) 在代码中更容易识别(无论是人还是grep等工具),这样就简化了在代码中找错的过程;

        (2) 更精确地指定了每一个强制转换的目的,有效利用编译器进行错误判断。如,如果试图用const_cast以外的类型来消除常量,则编译报错。

原文地址:https://www.cnblogs.com/wenshanzh/p/3277932.html