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

    Declare non-member functions when type conversions should apply to all parameters.

    1. class Rational
    2. {
    3. public:
    4. Rational(int numerator = 0, int denominator = 1);
    5. int numerator() const;
    6. int denominator() const;
    7. }
    8. class Rational
    9. {
    10. public:
    11. ...
    12. const Rational operator* (const Rational& rh) const;
    13. }
    14. Rational oneEighth(1, 8);
    15. Rational oneHalf(1, 2);
    16. result = oneHalf * 2; // OK
    17. result = 2 * oneHalf; // ERR
    18. const Rational operator*(const Rational& lhs, const Rational& rhs)
    19. {
    20. return Rational(lhs.numerator() * rhs.numerator(),
    21. lhs.denominator() * rhs.denominator())
    22. }

    第一种方式中由于不存在接受一个 int 和 Rational 作为参数的 non-member operator*, 因此失败。