item24: 若所有参数皆需类型转换,请为此采用non-member函数

来源:互联网 发布:相机驱动源码 编辑:程序博客网 时间:2024/05/22 10:43

首先强调一下,大部分情况下我都不是很喜欢隐式类型转换,因为没有显式转换那样所有代码全在掌控中的感觉。

至于本条款的议题,与item23一样似乎颇为违反直觉,幸运的是只要举一个简单的例子也许就能让你茅塞顿开。

class Rational{public:Rational(int numerator = 0, int denominator = 1); //非explicit支持隐式转换const Rational operator*(const Rational& rhs) const; //先看member函数的写法...};Rational oneHalf(1, 2);Rational r = oneHalf * 2; //goodRational r2 = 2 * oneHalf; //wrong

很容易理解,对于第二个乘法,没有适当的函数可以把被乘数2先转换成Rational对象再与oneHalf相乘,所以代码错误。

可是没有人会拒绝第二种用法的,而且只要把member函数改成non-member的,你就可以随意用上面的用法了:

const Rational operator*(const Rational& lhs, const Rational& rhs){...}

另一个需要注意的是不要试图画蛇添足的想把上面的函数声明为friend的,记得我们说过的吗,friend和member是一样的封装性的,所以不应该有任何理由让你觉得friend函数得比普通函数有更大的优先选择权。

0 0
原创粉丝点击