Item2 尽量使用 C++风格的类型转换

C++通过引进四个新的类型转换操作符克服了 C 风格类型转换的缺点, 这四个操作符是,static_cast, const_cast, dynamic_cast, 和 reinterpret_cast。在大多数情况下,对于这些操作符你只需要知道原来你习惯于这样写【(type) expression】而现在你总应该这样写【static_cast<type>(expression)】

 

static_cast 在功能上基本上与 C 风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用 static_cast 象用 C 风格的类型转换一样把 struct 转换成 int 类型或者把 double 类型转换成指针类型。

double result = static_cast<double>(firstNumber)/secondNumber;
 

const_cast 用于类型转换掉表达式的 const 或 volatileness 属性。通过使用 const_cast,你向人们和编译器强调你通过类型转换想做的只是改变一些东西的 constness 或者 volatileness 属性。

class Widget { ... };
class SpecialWidget: public Widget { ... };
void update(SpecialWidget *psw);
SpecialWidget sw; // sw 是一个非 const 对象。
const SpecialWidget& csw = sw; // csw 是 sw 的一个引用,它是一个 const 对象
update(&csw); // 错误!不能传递一个 const SpecialWidget* 变量
update(const_cast<SpecialWidget*>(&csw));// 正确,csw 的 const 被显示地转换掉
update((SpecialWidget*)&csw);// 同上,但用了一个更难识别的 C 风格的类型转换
 

dynamic_cast用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用 dynamic_cast 把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)

Widget *pw = new SpecialWidget;
update(pw); // 错误!pw 的类型是 Widget*,但是update 函数处理的是 SpecialWidget*类型
update(dynamic_cast<SpecialWidget*>(pw));// 正确,传递给 update 函数一个指针是指向变量类型为 SpecialWidget  的指针

 

reinterpret_casts 的最普通的用途就是在函数指针类型之间进行转换。例如,假设你有一个函数指针数组:
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳10 个 FuncPtrs 指针的数组
让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray 数组:int doSomething();
你不能不经过类型转换而直接去做,因为 doSomething 函数对于 funcPtrArray 数组来说有一个错误的类型。在 FuncPtrArray 数组里的函数返回值是 void 类型,而 doSomething函数返回值是 int 类型。
funcPtrArray[0] = &doSomething; // 错误!类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//reinterpret_cast 可以让你迫使编译器以你的方法去看待它们

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值