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<int>(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<D *>(pb);
         D *pd2 = dynamic_cast<D *>(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<B&>(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<int>(p);

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值