在我们进行c++编程时候,有时候我们希望显示地将对象强制转换成另外一种类型。
c++为我们提供了4中强制类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。
下面我们就来谈谈这4中强制类型转换的用法。
1. static_cast
在c++ Primer一书中对static_cast是这样描述的:任何具有明确定义的类型转换,只有不包括底层const,都可以使用static_cast。
它主要有如下几种用法:
①用于类层次结构中基类和派生类之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)是,由于没有没有动态类型检查,所以是不安全的。
②用于基本的数据类型的转换。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
下面是static_cast使用的一些例子:
#include <iostream>
using namespace std;
class CBase
{
public:
CBase() {}
virtual ~CBase() {}
};
class CDerived : public CBase
{
};
typedef struct rectangle
{
unsigned int uiLength;
unsigned int uiWide;
}RECTANGLE;
void Func(void *pParam)
{
//当对象有之间有"一定的关系"也可用static_cast转换
//例如:我们可以使用static_cast找回存在于void*指针中的值
RECTANGLE *pRectangle = static_cast<RECTANGLE *>(pParam);
cout << "Area = " << pRectangle->uiLength * pRectangle->uiWide << endl;
return;
}
int main(void)
{
//①用于类层次结构中基类和派生类之间指针或引用的转换。
CBase *pBase = new CBase();
CDerived *pDerived = new CDerived();
//进行上行转换,即派生类的指针或引用转换成基类
CDerived *pDerivedTmp = static_cast<CDerived *>(pBase); //安全
//进行下行转换,即基类指针或引用