static_cast 和 reinterpret_cast区别

C++中类型之间的转换,可以分为隐式类型转换和显式类型转换

隐式类型转换是自动执行的,无需显式的进行操作。 隐式类型转换发生在很多地方,比如函数实参到形参的类型转换、函数返回值类型的自动转换,在此不进行进一步的介绍。

C++ 提供四种转换操作符来实现显式类型转换(强类型转换),static_cast, reinterpret_cast, const_cast 和 dynamic_cast

const_cast 和 dynamic_cast

后面的两种中,const_cast用于去除除对象的const或者volatile属性;dynamic_cast 需要 RTTI 支持, 主要用于把基类指针转换为派生类指针

static_cast 和 reinterpret_cast

关于static_cast和reinterpret_cast,需要记住static_cast 运算符完成相关类型之间的转换. 而 reinterpret_cast 处理互不相关的类型之间的转换.

所谓"相关类型"指的是从逻辑上来说,多多少少还有那么一点联系的类型,比如从 double 到 int,我们知道它们之间还是有联系的,只是精度差异而已,使用 static_cast 就是告诉编译器:我知道会引起精度损失,但是我不在乎. 又如从 void* 到 具体类型指针像 char*,从语义上我们知道 void* 可以是任意类型的指针,当然也有可能是 char* 型的指针,这就是所谓的"多多少少还有那么一点联系"的意思. 又如从派生类层次中的上行转换(即从派生类指针到基类指针,因为是安全的,所以可以用隐式类型转换)或者下行转换(不安全,应该用 dynamic_cast 代替).
对于static_cast操作符,如果需要截断,补齐或者指针偏移编译器都会自动完成.注意这一点,是和 reinterpret_cast 的一个根本区别.

"互不相关的类型"指的是两种完全不同的类型,如从整型到指针类型,或者从一个指针到另一个毫不相干的指针.

reinterpret_cast 常用的一个用途是转换函数指针类型,即可以将一种类型的函数指针转换为另一种类型的函数指针,也可以将整数和指针之间进行转换,但这种转换可能会导致不正确的结果,需谨慎使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章