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

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

 2007-03-15 21:55:07 来源:WEB开发网   
核心提示: payment=USD(payment*1.05); // 没问题payment=payment*1.05; // 编译出错添加另一个构造函数:其次是添加另一个构造函数,该构造函数带一个 double 类型的参数:class USD{public:explicit USD(double v
payment=USD(payment*1.05); // 没问题
payment=payment*1.05; // 编译出错

添加另一个构造函数:

其次是添加另一个构造函数,该构造函数带一个 double 类型的参数:

class USD
{
public:
  explicit USD(double val)
  {
    dollars=val; // 拷贝整型部分
    long double temp=(val-dollars)*100; // 吸取美分
    // 避免截断 e.g., .6699 是 66 而不是 67
    cents=temp+0.5;
  }
};  

在此,构造函数被声明为‘explicit’,以避免不经意的赋值。为了让支付增加 5%,使用如下形式:

payment = USD(payment*1.05);

现在,一切都没有问题。混杂的构造函数不经意的转换被阻止,允许依赖转换操作符到 double 的正当转换。

以安全为重:

程序员常常抱怨在类 std::string 中缺乏 const char * 转换操作符。如果 std::string 具备这样的操作符,你可能会写:

string filename;
ifstream inf(filename);

代替丑陋的:

ifstream inf(filename.c_str());

不管怎样,C++ 标准化委员会决定在 std::string 中不包含此类转换操作符,因为它在某些广泛使用 char * 的库中可能导致令人厌恶的 bug。在这种情况下,标准委员会本着以安全为重的思路。与之对照,<fstream> 对象包含到 void * 类型的转换操作符,你可以象下面这样来使用它:

ifstream inf("myfile");
if (inf) // 使用 void * 转换操作符
// 使用此文件
else
// 失败

当你设计自己的类时,应该考虑启用/禁用哪种类型的自动转换。然后,通过定义适当的转换操作符来启用合法转换,而通过声明 explicit 构造函数来阻止不合需要的转换。

上一页  1 2 3 

Tags:转换 操作符 保护

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