C++的四种强制类型转换:
static_cast
dynamic_cast
const_cast
reinterpret_cast
下面对这块的知识点进行总结一下。
2.1static_cast
用于对,变量诸如int,char,double,float,之前的值进行相互转换。
float fdata = 3.56;
int m = static_cast<int>(fdata);
如果使用强制类型转换,int m = (int)fdata; 编译器会警告,丢失了精度,使用static_cast,则没有这种警告,表示我们希望强制进行转换。
2.2 dynamic_cast
是针对于类对象的,子类转父类在C++中可以很容易的实现,dynamic_cast 就是用来做父类转子类的
class CollaEntry {
public:
CollaEntry() {};
virtual ~CollaEntry() {};
};
class StringEntry :public CollaEntry {
public:
explicit StringEntry(const char* cstr) :
strData_(cstr) {};
explicit StringEntry(const std::string& cstr) :
strData_(cstr) {};
~StringEntry() {};
private:
std::string strData_;
};
int main()
{
CollaEntry* pcoen = new CollaEntry();
StringEntry* pstren = dynamic_cast<StringEntry*>(pcoen);
float fdata = 3.56;
int m = static_cast<int>(fdata);
//int m = (int)fdata;
std::cout << m <<"\n";
}
把父类转换成子类,前提是,你的父类指针动态指向的实例化对象,是包含派生类里面的成员的。
2.3reinterpret_cast
reinterpret_cast 运算符并不会改变括号中运算对象的值,而是对该对象从位模式上进行重新解释
在实战中的使用,比如这种场景,你创建了一个线程,把this传递过去
DWORD PASCAL CMotionDetectionProcessor::MotionDetectionThreadProc(LPVOID pVoid)
{
// Locals.
CMotionDetectionProcessor *pThis = NULL;
pThis = reinterpret_cast<CMotionDetectionProcessor*>(pVoid);
pThis->RunLiveMotionDetection();
return 0L;
}
把void指针转换成了对应类的指针。和 int* pin; char* pc = (char*)pin;效果是一样的。
2.4const_cast
去除复合类型中const的属性