MoreEffect[2] 尽量使用C++风格的类型转换
C++提供了4个特殊的强制转换运算符,分别是:
通用转换运算符(TYPE)本身太过粗暴直接,不能精确的描述C++中各种类型转换情况。这些转换运算符面向C++使用场景设计,相比C风格转换有了更多限制,可以规避多义、多态下转换的风险。
他们的运算优先级为2,和通用转换运算符相同,使用格式为:
cast-type<type>(expression);
(TYPE)value;//C风格的类型转换
4个转换运算符的用途受到编译器约束,应该在各自的场景下使用。尽管仍然是危险的,但可以让__转换本身和目的更加明显(对阅读者及编译器)__。即使所用的编译器不支持这些转换符,也可以定义宏来模拟,方便以后编译器的升级并提高代码可读性。
static_cast
static_cast在含义和功能上几乎和C风格的类型转换符一样粗暴和强大,但也有功能限制。其只有编译期类型检查,适用在整型间、整型和浮点数间的转换。但不能用在浮点数和指针、整形到结构体的转换。
static_cast可以用于将基类指针或引用转为派生类指针或引用(向上转换),因为派生类总是包含基类。但在向上转换中,基类指针所指实例可能并不包含目标派生类的变量和方法。没有运行期类型检查,编译器对转换的效果一无所知,但仍会通过。dynamic_cast有运行期类型检查,专用于处理向上转换的情况,远比static_cast安全。
const_cast
const_cast用于去除表达式的const、volatile、__unaligned属性。对于指针和引用,返回值会使它们指向实例的地址。由于存在编译期常量,const_cast不能用于去除常量的恒定状态。
const_cast是唯一可以用于去除上述限制符的转换符,使用其它转换符时编译器会报错。
dynamic_cast
用于安全的将派生链中类指针或引用向下转换,在转换错误时返回空或抛出异常。也可以用于向上转换。
dynamic_cast<type>(expression);
类型type必须是指向类的指针或引用,或空指针。表达式expression必须和类型对应:类型和表达式都是指针、类型为引用则表达式为左值。转换要求在类型和表达式是有继承关系的类间转换,基类中必须有虚函数(保证多态)。
dynamic_cast在运行时进行类型检查,当转换指针失败时返回空;当引用转换失败时抛出异常。
reinterpret_cast
reinterpret_cast即诠释转换,用于无关类型之间的转换,指示编译器将expression视为拥有type类型,同时保持完全相同的比特位(用新的类型诠释比特位数据)。
reinterpret_cast的使用容易出错且危险,应尽量使用其它转换符替代。且和其它转换符不同,reinterpret_cast是纯粹的编译期指令,不会编译成CPU指令而是根据其依赖的系统架构实现。
其最普通的用法是函数指针类型之间的转换,包括返回值类型不同的函数。

浙公网安备 33010602011771号