设为首页 加入收藏

TOP

C++学习笔记8-操作符重载(二)
2015-07-20 18:06:33 来源: 作者: 【 】 浏览:24
Tags:学习 笔记 操作 重载
) const

{

return data[index];// no range checking on index

}


9. 转换可能引起内置操作符的二义性我们再次扩展SmallInt 类。这一次,除了到int 的转换操作符和接受int 参数的构造函数之外,将增加一个重载的加操作符:

class SmallInt {

public:

SmallInt(int = 0); //convert from int to SmallInt

// conversion to intfrom SmallInt

operator int() const{ return val; }

// arithmetic operators

friend SmallInt

operator+(constSmallInt&, const SmallInt&);

private:

std::size_t val;

};

现在,可以用这个类将两个SmallInts 对象相加,但是,如果试图进行混合模式运算,将会遇到二义性问题:

SmallInt s1, s2;

SmallInt s3 = s1 +s2; // ok: uses overloaded operator+

int i = s3 + 0; //error: ambiguous

第一个加使用接受两个SmallInt 值的+ 的重载版本。第二个加有二义性,问题在于,可以将0 转换为SmallInt 并使用+ 的SmallInt 版本,也可以将 s3 转换为int 值并使用int 值上的内置加操作符。

既为算术类型提供转换函数,又为同一类类型提供重载操作符,可能会导致重载操作符和内置操作符之间的二义性。


10. 可行的操作符函数和转换

通过为每个调用列出可行函数,可以理解这两个调用的行为。在第一个调用中,有两个可行的加操作符:

?operator+(const SmallInt&, const SmallInt&)

?The built-in operator+(int, int)

内置的operator+(int, int)。

第一个加不需要实参转换――s1和s2 与形参的类型完全匹配。使用内置加操作符对两个实参都需要转换,因此,重载操作符与两个实参匹配得较好,所以将调用它。对于第二个加运算:

int i = s3 + 0; //error: ambiguous

两个函数同样可行。在这种情况下,重载的+ 版本与第一个实参完全匹配,而内置版本与第二个实参完全匹配。第一个可行函数对左操作数而言较好,而第二个可行函数对右操作数而言较好。因为找不到最佳可行函数,所以将该调用标记为有二义性的。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Codeforces 448 D. Multiplicatio.. 下一篇POJ 1094: Sorting It All Out( ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: