现在的位置: 首页 > 综合 > 正文

类型转换

2013年07月19日 ⁄ 综合 ⁄ 共 1547字 ⁄ 字号 评论关闭

一:隐式转换

内置转换原则:尽可能防止精度损失

如:

int ival = 0;

ival = 3.541 + 3;

首先将3转化为double类型,在将6.541转化为int类型

C++内置类型转换规则:

算术转换:将二元操作符的两个操作数转换为同一类型,并使表达式的值也具有相同的类型。最简单的转换为整体提升:对于所有比int小的整数,包括char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包容在int内,它们就会被提升为int型,否则,它们将被提升为unsigned int。

有符号与无符号类型之间的转换 :若表达式中使用了无符号数值,所定义的转换规则需保护操作数的精度。包含unsigned short和int的表达式,如果int型足够表示所有unsigned short型的值,则将unsigned short转换为int,否则,将两个操作数均转换为unsigned int。ps:这里需要考虑在不同系统各类型长度不同,一定要将操作数转化为能容下所有操作数的同一类型,如unsigned int和long会转化成unsigned long。

二:显示转换

显示转换也称为强制类型转换(cast),包括以下列名字命名的强制类型转换操作符:static_cast、dynamic_cast、const_cast和reinterpret_cast。

cast-name<type>( expression );

dynamic_cast:

可以使用dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针。与其他强制转换不同,dynamic_cast涉及运行时类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。dynamic_cast的类型验证必须在运行时执行。dynamic_cast一般用在这样的情况下,基类A指针pBase指向一个派生类B的对象derive,派生类指针pDerive2通过pDerive2 = dynamic_cast<B*>pBase;将pDerive2指向derive

const_cast:

顾名思义,const_cast将转换掉表达式的const性质,有const属性将被转换为无const属性,无const属性将被转化为有const属性。只有使用const_cast才能将表达式的const属性换掉,用const_cast符来修饰其他类型转换都会引发编译错误。如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果是0值;如果转换到引用类型的dynamic_cast失败,则抛出一个bad_cast异常。

static_cast:

编译器隐式执行的任何类型转换都可以由static_cast显式完成。当需要将一个较大的算术类型赋值给较小的类型时,若不采用显式转换,编译器通常会产生警告信息,告诉你可能会产生精度损失。若在不需考虑精度损失的情况下,使用static_cast进行显示转换则编译器不会产生警告信息。

reinterpret_cast:

reinterpret_cast通常为操作数的位模式提供较低层次的重新解释,意思也就是说reinterpret_cast可以无视类型,随意转换,编译器不会产生任何警告或错误信息,这非常危险,如果将不同类型的函数指针互相转换,用转换后的函数指针调用函数时,将发生不可预料的结局。

注意:应尽量避免使用强制类型转换。不管是使用const_cast还是reinterpret_cast都预示着设计缺陷,一个设计良好的系统不需要使用强制类型转换。static_cast和dynamic_cast,虽然各有各的用途,但都不应该频繁使用。

抱歉!评论已关闭.