最近在使用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,故该转化也可以称为是“重新翻译”