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

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

 2007-03-15 21:55:07 来源:WEB开发网   
核心提示:摘要:不经意的对象转换常常严重地危害代码的安全,幸运的是,用转换操作符保护代码的安全,转换操作符允许你根据实际情况来启用和禁用转换,这有助于避免出现病态行为,你想要的只不过是一个双接口:在适当的上下文中,USD 类对象除了应该提供安全的自动的到基本类型的转换外,某些对象必须要被转换成低级形式,反之亦然

摘要:不经意的对象转换常常严重地危害代码的安全。幸运的是,转换操作符允许你根据实际情况来启用和禁用转换,这有助于避免出现病态行为。

某些对象必须要被转换成低级形式,反之亦然。例如,使用 std::string 对象的程序员必须将之转换为 char 指针,请看下面例子:

string inf="mydata.txt";
ifstream infile(inf.c_str());// 必须要转成 const char*

同样,PSOIX 程序员需要将 <fstream> 对象转换成文件描述符以便 使用本地系统调用。

如何在不危及代码安全性的前提下让对象自动转换到其底层类型呢?

使用转换操作符和 explicit 构造函数来创建具备双接口的对象,从而避免病态行为转换。

提出问题:

商业和金融应用常常将币值表示成对象,而不是原始的浮点类型。之所以要这样做有几个原因:

  • 类型安全:人为错误更容易被发现;
  • 可移植性:由于对用户隐藏实现细节,代码具有更好的可移植性;
  • 业务逻辑:类允许你强化了业务逻辑规则。例如:美元(US dollar)类知道一美元是 100 美分(cents),而科威特第纳尔(dinar)类知道一第纳尔是 1000 菲尔斯(fils)。这种差别将影响 I/O 格式。
  • 下面是一个简化了的表示美国货币的类:

    class USD
    {
    private:
      __int64 dollars; //或者 long long, 依赖编译器
      int cents;
    public:
      USD(__int64 d=0, int c=0) :
       dollars(d), cents(c) {}
       friend bool operator==(const USD& d1, const USD& d2);
       //...other overloaded operators and functions
    };  

    唉,许多数学函数如:pow() 和 sqrt()都只认浮点变量。为了克服这个问题人们总是去重载关系操作符和算子。然而,你会发现这将带来大量无谓的编码,测试和维护工作。你想要的只不过是一个双接口:在适当的上下文中,USD 类对象除了应该提供安全的自动的到基本类型的转换外,它还应该提供上述所列的优点。

    1 2 3  下一页

    Tags:转换 操作符 保护

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