条款24:若所有参数皆需类型转换,请为此采用非成员函数
设计一个表示有理数的类时,允许从整数隐式转换为有理数是有用的:
class Rational {
public:Rational(int numerator = 0, // 该构造函数没有explicit限制;int denominator = 1); int numerator() const; int denominator() const;
//这里尝试将operator *作为Rational的成员函数const Rational operator*(const Rational& rhs) const;
private:int n,d;
};Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; // 正确
result = result * oneEighth; // 正确
result = oneHalf * 2; // result = oneHalf.operator*(2); 正确
//乘法应该是可交换的
result = 2 * oneHalf; // result = 2.operator*(oneHalf); 错误!
编译器还会寻找非成员运算符*(即命名空间或全局作用域中的运算符):
// result = operator*(2, oneHalf);,不存在,错误!
const Rational operator*(const Rational& lhs, const Rational& rhs)
{return Rational(lhs.numerator() * rhs.numerator(),lhs.denominator() * rhs.denominator());
}
Rational oneFourth(1, 4);
Rational result;
result = oneFourth * 2; // 正确
result = 2 * oneFourth; // 欧耶,它起作用了!
总结:如果所有参数都需要类型转换(包括一个*this),则该函数必须是一个非成员。