C++之强制类型转换

    最近在使用OpenCV2.x写代码的过程中,偶尔会看到某些函数的源代码,发现其使用的static_cast多谢。并且在看别人写的代码的时候,static_cast也越来越常见。看来之前学习的C语言风格的强制类型转换风格需要改变一下了(PS:估计我们这一批人上学用的都是谭浩强的教材,因此对C++标准了解不足)。下面总结下几种类型转换方式:


0. 传统的C语言风格

    在以前学习的C语言风格中,进行强制类型转换用的是:数据类型+变量。举例来说,

float x = 1.1;
int y,z;
y = (int)x;
z = int(x);

这种方式简单,但不能用于类之间的类型转换。


1. static_cast

   C++中执行非多态的转换,用于任意隐式转换,可替换C语言中的类型转换。比如,

int i;
float f = 66.7f;
i = static_cast(f); // i=66

2. dynamic_cast

    C++中主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。如,

class B{
  public:
         int m_iNum;
         virtual void foo();
  };
  class D:public B{
  public:
         char *m_szName[100];
  };

  void func(B *pb)
   {
         D *pd1 = static_cast(pb);
         D *pd2 = dynamic_cast(pb);
   }

3. const_cast

    在C++中该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。比如,

class B
  {
  public:
         int m_iNum;
         B(){}
  };
  void foo()
  {
         const B b1;
         //b1.m_iNum = 100; //compile error
         B& b2 = const_cast(b1);
         b2. m_iNum = 200; //fine?
  }
  int main()
  {
         foo();
         return 0;
  }

4. reinterpret_cast

    在C++中该运算符主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如,

int i;
char *p = "This is a example.";
i = reinterpret_cast(p);

此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,故该转化也可以称为是“重新翻译”


你可能感兴趣的:(C++学习)