WEB开发网
开发学院软件开发VC 用转换操作符保护代码的安全 阅读

用转换操作符保护代码的安全

 2007-03-15 21:55:07 来源:WEB开发网   
核心提示: 使用转换操作符:转换操作符在适当的上下文中将其对象自动转换成不同的类型,在类 USD 中,用转换操作符保护代码的安全(2),最自然的转换是到浮点的转换:USD payment(203, 67);此时,你想将支付对象转换为浮点值 203.76,这就是为什么它会产生这样一个令人为难的结果,声明

使用转换操作符:

转换操作符在适当的上下文中将其对象自动转换成不同的类型。在类 USD 中,最自然的转换是到浮点的转换:

USD payment(203, 67);

此时,你想将支付对象转换为浮点值 203.76。

转换操作符没有返回值(从操作符的名字上判断),也不带任何参数:

class USD
{
public:
  operator double() //conversion operator
  {
    double temp=(dollars*100)+cents;
    return temp/100;
  }
};  

让我们看看它是如何工作的。假设你想增加 5% 的支付:

double res=payment*1.05; //res=210.70

这样能工作得很好,因为进行乘法之前转换操作符自动将支付转换为值 200.67。但是,在 USD 类的设计上有一个严重的缺点。请看下面的代码:

payment=payment*1.05; // 很糟

现在,支付等于 210.00,这当然不是所期望的结果。让我们来看看为什么。右边子表达式 payment*1.05 首先被求值。正如你所看到的,这一部分没什么问题,产生的结果也是正确的。问题出在赋值上。编译器进行赋值的表达式如下:

payment=USD(__int64(200.67*1.05), 0);

乘法表达式的结果被暗中转换为整型(因此丢失分数部分),然后被用作一个临时 USD 对象的参数。这就是为什么它会产生这样一个令人为难的结果。

声明 ‘explicit’构造函数:

为了解决这个问题,首先将构造函数声明为 explicit:

class USD
{
public:
  explicit USD(__int64 d=0, int c=0):
  dollars(d), cents(c){}
  ...  

这样,只有 USD 对象的赋值才被接受:

Tags:转换 操作符 保护

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接