用转换操作符保护代码的安全
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 构造函数来阻止不合需要的转换。
更多精彩
赞助商链接